1.《硬件需求说明书》 —— 硬件需求说明书是描写硬件开发目标,基本功能、基本配置,主要性能指标、运行环境,约束条件以及开发经费和进度等要求,它的要求依据是产品规格说明书和系统需求说明书。它是硬件总体设计和制订硬件开发计划的依据,具体编写的内容有:系统工程组网及使用说明、硬件整体系统的基本功能和主要性能指标、硬件分系统的基本功能和主要性能指标以及功能模块的划分等。
2.《硬件总体设计报告》 —— 硬件总体设计报告是根据需求说明书的要求进行总体设计后出的报告,它是硬件详细设计的依据。编写硬件总体设计报告应包含以下内容:系统总体结构及功能划分,系统逻辑框图、组成系统各功能模块的逻辑框图,电路结构图及单板组成,单板逻辑框图和电路结构图,以及可靠性、安全性、电磁兼容性讨论和硬件测试方案等。
3.《单板总体设计方案》 —— 在单板的总体设计方案定下来之后应出这份文档,单板总体设计方案应包含单板版本号,单板在整机中的位置、开发目的及主要功能,单板功能描述、单板逻辑框图及各功能模块说明,单板软件功能描述及功能模块划分、接口简单定义与相关板的关系,主要性能指标、功耗和采用标准。
4.《单板硬件详细设计》 —— 在单板硬件进入到详细设计阶段,应提交单板硬件详细设计报告。在单板硬件详细设计中应着重体现:单板逻辑框图及各功能模块详细说明,各功能模块实现方式、地址分配、控制方式、接口方式、存贮器空间、中断方式、接口管脚信号详细定义、时序说明、性能指标、指示灯说明、外接线定义、可编程器件图、功能模块说明、原理图、详细物料清单以及单板测试、调试计划。有时候一块单板的硬件和软件分别由两个开发人员开发,因此这时候单板硬件详细设计便为软件设计者提供了一个详细的指导,因此单板硬件详细设计报告至关重要。尤其是地址分配、控制方式、接口方式、中断方式是编制单板软件的基础,一定要详细写出。
5.《单板软件详细设计》 —— 在单板软件设计完成后应相应完成单板软件详细设计报告,在报告中应列出完成单板软件的编程语言,编译器的调试环境,硬件描述与功能要求及数据结构等。要特别强调的是:要详细列出详细的设计细节,其中包括中断、主程序、子程序的功能、入口参数、出口参数、局部变量、函数调用和流程图。在有关通讯协议的描述中,应说明物理层,链路层通讯协议和高层通讯协议由哪些文档定义。
6.《单板硬件过程调试文档》 —— 开发过程中,每次所投 PCB 板,工程师应提交一份过程文档,以便管理阶层了解进度,进行考评,另外也给其他相关工程师留下一份有参考价值的技术文档。每次所投 PCB 板时 应制作此文档。这份文档应包括以下内容:单板硬件功能模块划分,单板硬件各模块调试进度,调试中出现的问题及解决方法,原始数据记录、系统方案修改说明、单板方案修改说明、器件改换说明、原理图、PCB 图修改说明、可编程器件修改说明、调试工作阶段总结、调试进展说明、下阶段调试计划以及测试方案的修改。
7.《单板软件过程调试文档》 —— 每月收集一次单板软件过程调试文档,或调试完毕(指不满一月)收集,尽可能清楚,完整列出软件调试修改过程。单板软件过程调试文档应当包括以下内容:单板软件功能模块划分及各功能模块调试进度、单板软件调试出现问题及解决、下阶段的调试计划、测试方案修改。
单板整体功能的准确描述和模块的精心划分 && 接口的详细设计 && 关键元器件的功能描述及评审,元器件的选择 && 符合规范的原理图及 PCB 图 && 对 PCB 板的测试及调试计划
)
8.《单板系统联调报告》 —— 在项目进入单板系统联调阶段,应出单板系统联调报告。单板系统联调报告包括这些内容:系统功能模块划分、系统功能模块调试进展、系统接口信号的测试原始记录及分析、系统联调中出现问题及解决、调试技巧集锦、整机性能评估等。
9.《单板硬件测试文档》 —— 在单板调试完之后,申请内部验收之前,应先进行自测以确保每个功能都能实现,每项指标都能满足。自测完毕应出单板硬件测试文档,单板硬件测试文档包括以下内容:单板功能模块划分、各功能模块设计输入输出信号及性能参数、各功能模块测试点确定、各测试参考点实测原始记录及分析、板内高速信号线测试原始记录及分析、系统 I/O 口信号线测试原始记录及分析,整板性能测试结果分析。
10.《单板硬件归档详细文档》
11.《单板软件归档详细文档》
12.《硬件总体方案归档详细文档》
13.《硬件单板总体方案归档详细文档》
14.《硬件信息库》 —— 为了共享技术资料,我们希望建立一个共享资料库,每一块单板都希望将的最有价值最有特色的资料归入此库。硬件信息库包括以下内容:典型应用电路、特色电路、特色芯片技术介绍、特色芯片的使用说明、驱动程序的流程图、源程序、相关硬件电路说明、PCB 布板注意事项、单板调试中出现的典型及解决、软硬件设计及调试技巧。
登录:阿里云控制台 –> 产品与服务 –> 证书服务 –> 购买证书
购买:证书类型选择 –> 免费型 DV SSL –> 然后完成购买
补全:在 我的证书
控制台,找到购买的证书,在操作栏里选择 补全
填写证书相关信息
域名验证:可以选择 DNS ,如果域名用了阿里云的 DNS 服务,再勾选一下 证书绑定的域名在阿里云的云解析
上传:系统生成 CSR ,创建证书
提交审核
如果一切正常,10分钟左右,申请的证书就会审核通过
在域名的管理里,因为我用了阿里云的 DNS 解析服务,所以会自动添加一条 CNAME 记录,这条记录就是验证域名所有权用的
在阿里云的证书管理那里,如果申请的证书审核通过,你就可以下载了,可以选择不同的类型,我选择的 NGINX 服务器,解压以后,你会得到两个文件一个是 .key,一个是 .pem
注册一个 Netlify 帐号,地址 Netlify App 选择用 GitHub 注册就好了
添加一个新的站点,在 Domain management 中设置自己的域名,我这里设置成 eseries.studio
然后根据 Netlify 的提示设置好阿里云的 DNS 解析服务
最后上传证书,这里需要注意以下配置
从第一个 —–BEGIN CERTIFICATE—– 到第一个 —–END CERTIFICATE—– 结束
从第二个 —–BEGIN CERTIFICATE—– 到第二个 —–END CERTIFICATE—– 结束
结合了两位大神的文章,使用 springboot + react + dva + antd 快速实现 CURD 应用,包含后台数据服务,前端查询、编辑、删除、创建以及分页处理,数据 mock ,自动处理 loading 状态等。
我用的是 eclipse,先在 eclipse marketplace 里面安装 Spring Tools ,然后新建 Spring Starter Project。
选择要使用的组件,这里我选了 Mybitis 和 MySQL ,后期要添加其他组件去 pom.xml 添加即可。
1 | # ############################################# MySQL 配置 ############################################ |
创建完之后项目文件大概长这样
编辑 UserDO1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43package com.ethan.oms_springboot.User;
import java.io.Serializable;
public class UserDO implements Serializable {
private static final long serialVersionUID = -7572697046940288333L;
private String id;
private String username;
private String name;
private String permission;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getusername() {
return username;
}
public void setusername(String username) {
this.username = username;
}
public String getname() {
return name;
}
public String getpermission() {
return permission;
}
public void setname(String name) {
this.name = name;
}
}
编辑 UserMapper1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18package com.ethan.oms_springboot.User;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
public interface UserMapper {
UserDO selectPersonById(Integer id);
List<UserDO> selectAll();
void insert(UserDO userDO);
Long update(UserDO userDO);
Long delete(Long id);
}
编辑 Mybitis 的 UserMapper.xml ,这个文件主要就是MySQL的语句1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.ethan.oms_springboot.User.UserMapper">
<insert id="insert" parameterType="UserDO" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users(username,name) VALUES(#{username},#{name})
</insert>
<update id="update" parameterType="UserDO">
UPDATE users SET username=#{username},name=#{name} WHERE id=#{id}
</update>
<delete id="delete" parameterType="java.lang.Long">
DELETE FROM users WHERE id=#{id}
</delete>
<select id="selectPersonById" resultType="UserDO">
select * from users where id = #{id}
</select>
<select id="selectAll" resultType="UserDO">
SELECT id, username, name, permission FROM users
</select>
</mapper>
}
编辑 UserController1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49package com.ethan.oms_springboot.User;
import com.ethan.oms_springboot.User.UserDO;
import com.ethan.oms_springboot.User.UserMapper;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
public class UserController {
private UserMapper userMapper;
"/save") (
public String save() {
UserDO userDO = new UserDO();
userDO.setusername("test101");
userDO.setname("唐伯虎");
userMapper.insert(userDO);
return userDO.getId();
}
"/update") (
public Long update() {
UserDO userDO = new UserDO();
userDO.setId("3");
userDO.setusername("test101");
userDO.setname("唐伯虎");
return userMapper.update(userDO);
}
"/delete") (
public Long delete() {
return userMapper.delete(10L);
}
"/selectById") (
public UserDO selectById() {
return userMapper.selectPersonById(3);
}
"/users") (
public List<UserDO> selectAll() {
return userMapper.selectAll();
}
}
写完以上应该可以通过 http://127.0.0.1:8080 访 MySQL 问数据库了
先安装 dva-cli,并确保版本是 0.7.x1
2
3 npm i dva-cli@0.7 -g
dva -v
0.7.0
然后创建应用(项目路径就是oms)1
2 dva new oms
cd oms
babel-plugin-import 用于引入 antd 的 JavaScript 和 CSS,可以实现按需加载,打包时会小一点1
2 npm i antd --save
npm i babel-plugin-import --save-dev
修改 .roadhogrc,在 “extraBabelPlugins” 里加上:1
["import", { "libraryName": "antd", "style": "css" }]
修改 .roadhogrc,加上 “proxy” 配置:1
2
3
4
5
6
7"proxy": {
"/api": {
"target": "http://127.0.0.1:8080",
"changeOrigin": true,
"pathRewrite": { "^/api" : "" }
}
},
然后启动应用:(这个命令一直开着,后面不需要重启,会自动刷新)1
npm start
浏览器会自动打开 http://localhost:8000 ,访问 http://localhost:8000/api/users ,就能访问到 http://127.0.0.1:8080/users 的数据
用 dva-cli 生成路由:1
dva g route users
然后就可以通过 http://localhost:8000/#/users 代替 http://localhost:8000/api/users
用 dva-cli 生成 Model :1
dva g model users
修改 src/models/users.js :1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53import * as usersService from '../services/users';
export default {
namespace: 'users',
state: {
list: [],
total: null,
page: null,
},
reducers: {
save(state, { payload: { data: list, total, page } }) {
return { ...state, list, total, page };
},
},
effects: {
*fetch({ payload: { page = 1 } }, { call, put }) {
const { data, headers } = yield call(usersService.fetch, { page });
yield put({
type: 'save',
payload: {
data,
total: parseInt(headers['x-total-count'], 10),
page: parseInt(page, 10),
},
});
},
*remove({ payload: id }, { call, put }) {
yield call(usersService.remove, id);
yield put({ type: 'reload' });
},
*patch({ payload: { id, values } }, { call, put }) {
yield call(usersService.patch, id, values);
yield put({ type: 'reload' });
},
*create({ payload: values }, { call, put }) {
yield call(usersService.create, values);
yield put({ type: 'reload' });
},
*reload(action, { put, select }) {
const page = yield select(state => state.users.page);
yield put({ type: 'fetch', payload: { page } });
},
},
subscriptions: {
setup({ dispatch, history }) {
return history.listen(({ pathname, query }) => {
if (pathname === '/users') {
dispatch({ type: 'fetch', payload: query });
}
});
},
},
};
新增 src/services/users.js1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26import request from '../utils/request';
import { PAGE_SIZE } from '../constants';
export function fetch({ page }) {
return request(`/api/users?_page=${page}&_limit=${PAGE_SIZE}`);
}
export function remove(id) {
return request(`/api/users/${id}`, {
method: 'DELETE',
});
}
export function patch(id, values) {
return request(`/api/users/${id}`, {
method: 'PATCH',
body: JSON.stringify(values),
});
}
export function create(values) {
return request('/api/users', {
method: 'POST',
body: JSON.stringify(values),
});
}
由于我们需要从 response headers 中获取 total users 数量,所以需要改造下 src/utils/request.js1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37import fetch from 'dva/fetch';
function checkStatus(response) {
if (response.status >= 200 && response.status < 300) {
return response;
}
const error = new Error(response.statusText);
error.response = response;
throw error;
}
/**
* Requests a URL, returning a promise.
*
* @param {string} url The URL we want to request
* @param {object} [options] The options we want to pass to "fetch"
* @return {object} An object containing either "data" or "err"
*/
export default async function request(url, options) {
const response = await fetch(url, options);
checkStatus(response);
const data = await response.json();
const ret = {
data,
headers: {},
};
if (response.headers.get('x-total-count')) {
ret.headers['x-total-count'] = response.headers.get('x-total-count');
}
return ret;
}
用 dva-cli 生成 component1
dva g component Users/Users
然后修改生成出来的 src/components/Users/Users.js 和 src/components/Users/Users.css1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108import React from 'react';
import { connect } from 'dva';
import { Table, Pagination, Popconfirm, Button } from 'antd';
import { routerRedux } from 'dva/router';
import styles from './Users.css';
import { PAGE_SIZE } from '../../constants';
import UserModal from './UserModal';
function Users({ dispatch, list: dataSource, loading, total, page: current }) {
function deleteHandler(id) {
dispatch({
type: 'users/remove',
payload: id,
});
}
function pageChangeHandler(page) {
dispatch(routerRedux.push({
pathname: '/users',
query: { page },
}));
}
function editHandler(id, values) {
dispatch({
type: 'users/patch',
payload: { id, values },
});
}
function createHandler(values) {
dispatch({
type: 'users/create',
payload: values,
});
}
const columns = [
{
title: '用户名',
dataIndex: 'username',
key: 'username',
},
{
title: '姓名',
dataIndex: 'name',
key: 'name',
render: text => <a href="">{text}</a>,
},
{
title: '权限',
dataIndex: 'permission',
key: 'permission',
},
{
title: '操作',
key: 'operation',
render: (text, record) => (
<span className={styles.operation}>
<UserModal record={record} onOk={editHandler.bind(null, record.id)}>
<a>编辑</a>
</UserModal>
<Popconfirm title="确定删除?" onConfirm={deleteHandler.bind(null, record.id)}>
<a href="">删除</a>
</Popconfirm>
</span>
),
},
];
return (
<div className={styles.normal}>
<div>
<div className={styles.create}>
<UserModal record={{}} onOk={createHandler}>
<Button type="primary">Create User</Button>
</UserModal>
</div>
<Table
columns={columns}
dataSource={dataSource}
loading={loading}
rowKey={record => record.id}
pagination={false}
/>
<Pagination
className="ant-table-pagination"
total={total}
current={current}
pageSize={PAGE_SIZE}
onChange={pageChangeHandler}
/>
</div>
</div>
);
}
function mapStateToProps(state) {
const { list, total, page } = state.users;
return {
loading: state.loading.models.users,
list,
total,
page,
};
}
export default connect(mapStateToProps)(Users);
在 src/routes/Users.js 中引用他1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import React from 'react';
import { connect } from 'dva';
import styles from './Users.css';
import UsersComponent from '../components/Users/Users';
import MainLayout from '../components/MainLayout/MainLayout';
function Users({ location }) {
return (
<MainLayout location={location}>
<div className={styles.normal}>
<UsersComponent />
</div>
</MainLayout>
);
}
export default connect()(Users);
需留意两件事:
1.对 model 进行了微调,加入了 page 表示当前页
2.由于 components 和 services 中都用到了 pageSize,所以提取到 src/constants.js
改完后,切换到浏览器,应该能看到带分页的用户列表。
添加 layout 布局,使得我们可以在首页和用户列表页之间来回切换
添加布局,src/components/MainLayout/MainLayout.js 和 CSS 文件
在 src/routes 文件夹下的文件中引用这个布局1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18import React from 'react';
import styles from './MainLayout.css';
import Header from './Header';
function MainLayout({ children, location }) {
return (
<div className={styles.normal}>
<Header location={location} />
<div className={styles.content}>
<div className={styles.main}>
{children}
</div>
</div>
</div>
);
}
export default MainLayout;
1 | .normal { |
这时页面的菜单会随着页面切换变化,高亮显示当前页所在的菜单项
dva 有一个管理 effects 执行的 hook,并基于此封装了 dva-loading 插件
通过这个插件,不必一遍遍地写 showLoading 和 hideLoading,当发起请求时,插件会自动设置数据里的 loading 状态为 true 或 false ,然后我们在渲染 components 时绑定并根据这个数据进行渲染
先安装 dva-loading1
npm i dva-loading --save
修改 src/index.js 加载插件,在合适的地方加入下面两句1
2import createLoading from 'dva-loading';
app.use(createLoading());
然后在 src/components/Users/Users.js 里绑定 loading 数据:1
loading: state.loading.models.users,
只改一个文件 src/components/Users/Users.js 就好
处理分页有两个思路:
1.发 action,请求新的分页数据,保存到 model,然后自动更新页面
2.切换路由 (由于之前监听了路由变化,所以后续的事情会自动处理)
我们用的是思路 2 的方式,好处是用户可以直接访问到 page 2 或其他页面
注:第10步的文件为已修改的代码
功能调整基本都可以按照修改以下三个地方进行
1.service
2.model
3.component
service, 修改 src/services/users.js1
2
3
4
5export function remove(id) {
return request(`/api/users/${id}`, {
method: 'DELETE',
});
}
model, 修改 src/models/users.js1
2
3
4
5*remove({ payload: id }, { call, put, select }) {
yield call(usersService.remove, id);
const page = yield select(state => state.users.page);
yield put({ type: 'fetch', payload: { page } });
},
component, 修改 src/components/Users/Users.js,替换 deleteHandler 内容1
2
3
4dispatch({
type: 'users/remove',
payload: id,
});
处理用户编辑和前面的一样,遵循三步走:
先是 service,修改 src/services/users.js1
2
3
4
5
6export function patch(id, values) {
return request(`/api/users/${id}`, {
method: 'PATCH',
body: JSON.stringify(values),
});
}
再是 model,修改 src/models/users.js1
2
3
4
5*patch({ payload: { id, values } }, { call, put, select }) {
yield call(usersService.patch, id, values);
const page = yield select(state => state.users.page);
yield put({ type: 'fetch', payload: { page } });
},
最后是 component,详见第10步的代码
需要注意的一点是,我们在这里如何处理 Modal 的 visible 状态,有几种选择:
1.存 dva 的 model state 里
2.存 component state 里
另外,怎么存也是个问题,可以:
1.只有一个 visible,然后根据用户点选的 user 填不同的表单数据
2.几个 user 几个 visible
此教程选的方案是 2-2,即存 component state,并且 visible 按 user 存,另外为了使用的简便,封装了一个 UserModal 的组件
2018年06月15日
更新V1.1.3
- 调整普通坐标渐进绘制函数
- 优化显示表盘刻度值位置
- 已知BUG——不选定【主坐标】绘制不正确
2018年06月11日
更新V1.1.2
2017年12月28日
更新V1.0.2
- 实装Logo图标绘制功能
- 修复日常BUG
2017年12月05日
更新V1.0.1
- 新增外表盘单位绘制功能,支持单位名称、字号、颜色、位置自定义
- 新增作业进度条及Loading提示界面
- 新增更新历史界面,点击《表盘设计系统》即可打开、关闭该界面
- 新增高分辨率显示器支持
- 修复未关闭本系统无法将导出的矢量图导入第三方绘图软件的BUG
2017年11月29日
更新V1.0.0
- 该版本为第一个用户试用版
- 已支持基本的外表盘绘制功能
- 已支持导出表盘WMF格式矢量图片
- 支持初始默认数据导入
1 | $ sudo gedit /etc/apt/sources.list |
在弹出的文本框中将原始内容全部清空,修改成下面的旧源,保存并退出1
2
3
4
5
6
7
8
9
10deb http://old-releases.ubuntu.com/ubuntu/ natty main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ natty-security main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ natty-updates main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ natty-proposed main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ natty-backports main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ natty main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ natty-security main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ natty-updates main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ natty-proposed main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ natty-backports main restricted universe multiverse
更新源1
$ sudo apt-get update
1 | $ tar zxf <ltib_release>.tar.gz |
1 | $ cd <your LTIB directory> |
错误提示:
1 | ------------------------------------------------------------------------------ |
解决办法:
根据Freescale官方手册Setting_Up_LTIB_Host_on_Ubuntu_9_04.pdf
Install packages needed by LTIB1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Install packages needed by LTIB
$ sudo aptitude -y install gettext libgtk2.0-dev rpm bison m4 libfreetype6-dev
$ sudo aptitude -y install libdbus-glib-1-dev liborbit2-dev intltool
$ sudo aptitude -y install ccache ncurses-dev zlib1g zlib1g-dev gcc g++ libtool
$ sudo aptitude -y install uuid-dev liblzo2-dev
$ sudo aptitude -y install tcl dpkg
# Packages required for 64-bit Ubuntu
# Do "uname -a" and see if the word "x86_64" shows up.
if uname -a|grep -sq 'x86_64'; then
sudo aptitude -y install ia32-libs libc6-dev-i386 lib32z1
fi
# The following recommended for Linux development.
# They are not required by LTIB.
$ sudo aptitude -y install gparted emacs22-nox openssh-server
$ sudo aptitude -y install nfs-common nfs-kernel-server lintian
$ sudo aptitude -y install git-core git-doc git-email git-gui gitk
$ sudo aptitude -y install diffstat indent tofrodos fakeroot doxygen uboot-mkimage
$ sudo aptitude -y install sendmail mailutils meld atftpd sharutils
$ sudo aptitude -y install manpages-dev manpages-posix manpages-posix-dev linux-doc
$ sudo aptitude -y install vnc4server xvnc4viewer
解决完上面的错误,继续执行1
$ ./ltib
错误提示:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31------------------------------------------------------------------------------
I ran the command: sudo -S -l which returned:
[sudo] password for ethan: Sorry, try again.
[sudo] password for ethan: Sorry, try again.
[sudo] password for ethan: Sorry, try again.
sudo: 3 incorrect password attempts
This means you don't have sudo permission to execute rpm commands as root
without a password. This is needed for this build script to operate correctly.
To configure this, as root using the command "/usr/sbin/visudo",
and add the following line in the User privilege section:
ethan ALL = NOPASSWD: /usr/bin/rpm, /opt/freescale/ltib/usr/bin/rpm
traceback:
main::check_sudo_setup:2467
main::host_checks:1413
main:554
Started: Tue May 31 22:25:48 2016
Ended: Tue May 31 22:25:53 2016
Elapsed: 5 seconds
Build Failed
Exiting on error or interrupt
------------------------------------------------------------------------------
解决办法:
根据Freescale官方手册Setting_Up_LTIB_Host_on_Ubuntu_9_04.pdf
LTIB is executed as a regular user but requires root privileges during execution. To accommodate this, the sudoers file needs to be modified.
Run this command to edit the sudoers file:1
$ sudo visudo
Add the following line to the end of the sudoers file.1
%admin ALL = NOPASSWD: /usr/bin/rpm, /opt/freescale/ltib/usr/bin/rpm
解决完上面的错误,继续执行1
$ ./ltib
提示是接近一个小时的等待OvO
…
…
…
…
…
…
…
一个小时已经过去,然而并没有完成OvO
…
…
…
…
…
…
…
一个半小时已经过去,我要睡觉了OvO
起床发现还是不行,打开log文件发现
Updating lpp from local packages
错误提示:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34------------------------------------------------------------------------------
Updating lpp from local packages
Processing platform: Host support packages
============================================
using /home/ethan/ltib/config/platform/host/ltib.preconfig
Processing: fake-provides
===========================
Processing: mkspooflinks
==========================
Build path taken because: directory build,
Cowardly refusing to clobber existing directory:
/opt/freescale/ltib/usr/src/rpm/BUILD/mkspooflinks-3.4
Remove this by hand if you really want to rebuild this package from scratch
Died at ./ltib line 1392.
traceback:
main::build_host_rpms:1392
main::host_checks:1447
main:554
Started: Thu Jun 23 18:48:59 2016
Ended: Thu Jun 23 18:49:00 2016
Elapsed: 1 seconds
These packages failed to build:
mkspooflinks
Build Failed
------------------------------------------------------------------------------
解决办法:
oh,跟我预想一样,安装在Mac共享文件夹下是不行的
换到Ubuntu本地,继续执行1
$ ./ltib
错误提示:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25------------------------------------------------------------------------------
Processing: mtd-utils
=======================
Build path taken because: no prebuilt rpm,
Try mtd-utils-1.5.0.tar.gz.md5 from the GPP
http://bitshrine.org/gpp/mtd-utils-1.5.0.tar.gz.md5:
19:05:31 ERROR 404: Not Found.
Try mtd-utils-1.5.0.tar.gz from the GPP
http://bitshrine.org/gpp/mtd-utils-1.5.0.tar.gz:
19:05:31 ERROR 404: Not Found.
Can't get: mtd-utils-1.5.0.tar.gz at ./ltib line 802.
Died at ./ltib line 1392.
traceback:
main::build_host_rpms:1392
main::host_checks:1447
main:554
Started: Thu Jun 23 18:58:07 2016
Ended: Thu Jun 23 19:05:31 2016
Elapsed: 444 seconds
These packages failed to build:
mtd-utils
------------------------------------------------------------------------------
解决办法:
初步断定是源不行了,经过一天的摸索,替换源什么的都试了,过程中太多包找不到了,后来偶然发现下载的L2.6.35_1.1.0_130130_source里面有pkgs,也是醉了…原来还是共享文件夹的问题
删除opt/freescale文件夹
L2.6.35_1.1.0_130130_source拷贝到Ubuntu下,重新执行1
2$ ./<ltib_release>/install
$ ./ltib
错误提示:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61------------------------------------------------------------------------------
Processing platform: Freescale iMX28 Based Boards
===================================================
using config/platform/imx/.config
Processing: fake-provides
===========================
Processing: u-boot
====================
Build path taken because: directory build, no prebuilt rpm,
scbuild/scdeploy already unpacked package
Processing: u-boot
====================
Build path taken because: directory build, build key set, no prebuilt rpm,
rpmbuild --dbpath /home/ethan/ltib/rootfs//var/lib/rpm --target arm --define '_unpackaged_files_terminate_build 0' --define '_target_cpu arm' --define '__strip strip' --define '_topdir /home/ethan/ltib/rpm' --define '_prefix /usr' --define '_tmppath /home/ethan/ltib/tmp' --define '_rpmdir /home/ethan/ltib/rpm/RPMS' --define '_mandir /usr/share/man' --define '_sysconfdir /etc' --define '_localstatedir /var' -bc --short-circuit /home/ethan/ltib/tmp/u-boot.spec
Building target platforms: arm
Building for target arm
Executing(%build): /bin/sh -e /home/ethan/ltib/tmp/rpm-tmp.93639
+ umask 022
+ cd /home/ethan/ltib/rpm/BUILD
+ cd u-boot-2009.08
+ : mx28_evk_config
+ eval echo
+ echo
+ PKG_U_BOOT_PATH_PRECONFIG=
+ SRC_DIR=/home/ethan/ltib/rpm/BUILD/u-boot-2009.08
+ BUILD_DIR=/home/ethan/ltib/rpm/BUILD/u-boot-2009.08
+ [ /home/ethan/ltib/rpm/BUILD/u-boot-2009.08 != /home/ethan/ltib/rpm/BUILD/u-boot-2009.08 ]
+ cd /home/ethan/ltib/rpm/BUILD/u-boot-2009.08
+ [ -n ]
+ make HOSTCC=ccache /usr/bin/gcc -B/usr/bin/ CROSS_COMPILE=arm-none-linux-gnueabi- O=/home/ethan/ltib/rpm/BUILD/u-boot-2009.08 mx28_evk_config
make: *** No rule to make target `mx28_evk_config'. Stop.
error: Bad exit status from /home/ethan/ltib/tmp/rpm-tmp.93639 (%build)
RPM build errors:
Bad exit status from /home/ethan/ltib/tmp/rpm-tmp.93639 (%build)
Build time for u-boot: 0 seconds
Failed building u-boot
f_buildrpms() returned an error, exiting
traceback:
main:572
Started: Sun Jul 3 01:34:21 2016
Ended: Sun Jul 3 01:35:33 2016
Elapsed: 72 seconds
These packages failed to build:
u-boot
Build Failed
Exiting on error or interrupt
------------------------------------------------------------------------------
解决办法
nxp的论坛里面给出了解决方法,由于我重新在12.04上搭建环境,所以没有尝试
https://community.nxp.com/thread/303737
1 | $ sudo apt-get update |
1 | $ cd ~ |
解压拷贝到~/ltib下1
2$ cd ~/ltib
$ git apply 0001_make_L2.6.35_1.1.0_130130_compile_on_ubuntu_12.04_64bit_OS.patch
1 | $ cd ~/ltib |
1 | ------------------------------------------------------------------------------ |
在~/ltib/rootfs/boot/下面会生成以下固件
操作系统: OS X EL Capitan 10.11.4
Node.js: node-v4.4.2.pkg
Homebrew: 安装git用的,这里就不介绍了
git: 安装hexo会用到,也不介绍了
我下载的是node-v4.4.2.pkg安装包直接安装即可。
安装完成后进入终端输入1
$ npm
提示以下内容就是OK了。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26Usage: npm <command>
where <command> is one of:
access, add-user, adduser, apihelp, author, bin, bugs, c,
cache, completion, config, ddp, dedupe, deprecate, dist-tag,
dist-tags, docs, edit, explore, faq, find, find-dupes, get,
help, help-search, home, i, info, init, install, issues, la,
link, list, ll, ln, login, logout, ls, outdated, owner,
pack, ping, prefix, prune, publish, r, rb, rebuild, remove,
repo, restart, rm, root, run-script, s, se, search, set,
show, shrinkwrap, star, stars, start, stop, t, tag, team,
test, tst, un, uninstall, unlink, unpublish, unstar, up,
update, upgrade, v, version, view, whoami
npm <cmd> -h quick help on <cmd>
npm -l display full usage info
npm faq commonly asked questions
npm help <term> search for help on <term>
npm help npm involved overview
Specify configs in the ini-formatted file:
/Users/Ethan/.npmrc
or on the command line via: npm <command> --key value
Config info can be viewed via: npm help config
npm@2.15.0 /usr/local/lib/node_modules/npm
根据hexo官方文档直接终端输入以下命令即可1
2
3
4
5$ npm install -g hexo-cli
$ hexo init blog
$ cd blog
$ npm install
$ hexo server
打开本地服务器预览(点击访问 http://localhost:4000 ,就可以看到了你的blog了)
之后你可以将blog文件夹放到任何你想放的地方,如果之后部署有问题请使用超级权限sudo
执行如下命令:1
npm install hexo-generator-feed --save
执行如下命令:1
npm install hexo-generator-sitemap --save
1 | npm install hexo-generator-index --save |
在自己Github创建一个新的repository。比如我的Github账号是ethanjuenchu,那么我应该创建的repository名字应该是ethanjunechu.github.io。
Coding与Github类似就不啰嗦了。
_config.yml位于blog文件夹的根目录,里面是你blog的一些基本配置,我的配置修改如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101# Hexo Configuration
# # Docs: http://hexo.io/docs/configuration.html
# # Source: https://github.com/hexojs/hexo/
# Site
title: ESERIES
subtitle:
description: 不精独乐
author: Ethan
language: zh-CN
timezone:
# URL
# # If your site is put in a subdirectory
# # set url as 'http://yoursite.com/child' and root as '/child/'
url: http://ethanjunechu.coding.me
root: /
permalink: :year/:month/:day/:title/
permalink_defaults:
# Directory
source_dir: source
public_dir: public
tag_dir: tags
archive_dir: archives
category_dir: categories
code_dir: downloads/code
i18n_dir: :lang
skip_render:
# Writing
new_post_name: :title.md # File name of new posts
default_layout: post
titlecase: false # Transform title into titlecase
external_link: true # Open external links in new tab
filename_case: 0
render_drafts: false
post_asset_folder: false
relative_link: false
future: true
highlight:
enable: true
line_number: true
auto_detect: true
tab_replace:
# Category & Tag
default_category: uncategorized
category_map:
tag_map:
# Date / Time format
# # Hexo uses Moment.js to parse and display date
# # You can customize the date format as defined in
# # http://momentjs.com/docs/# /displaying/format/
date_format: YYYY-MM-DD
time_format: HH:mm:ss
# Pagination
# # Set per_page to 0 to disable pagination
per_page: 10
pagination_dir: page
# Extensions
# # Plugins: http://hexo.io/plugins/
index_generator:
per_page: 10 ## 首页默认10篇文章标题 如果值为0不分页
archive_generator:
per_page: 10 ## 归档页面默认10篇文章标题
yearly: true ## 生成年视图
monthly: true ## 生成月视图
tag_generator:
per_page: 10 ## 标签分类页面默认10篇文章
category_generator:
per_page: 10 ### 分类页面默认10篇文章
sitemap:
path: sitemap.xml
feed:
type: atom
path: atom.xml
limit: 20
duoshuo_shortname: ## 这里填写你的多说的短网址
# # Themes: http://hexo.io/themes/
theme: apollo ## 主题的名称,我用的是apollo,默认的是landscape
# Deployment
# # Docs: http://hexo.io/docs/deployment.html
deploy:
type: git
repo:
github: https://github.com/ethanjunechu/ethanjunechu.github.io.git
coding: https://git.coding.net/ethanjunechu/ethanjunechu.git
branch: master
这里面基本都有注解,说一下最后的deploy(部署)分别为你的Github和Coding的发布链接,与上一步你注册的账号的repository相对应。
这是最后一步,进入你的终端,进入你的blog文件夹1
$ hexo d -g
之后会分别叫你输入Github和Coding的密码。
发布失败有可能是隐藏文件引起的,需要删除OS X下面的隐藏文件.DS_tore。
主题文件就放进themes文件夹,在_config.yml里面启用就行了。
发布成功,web显示extends partial/layout block container include mixins/post +posts() block pagination include mixins/paginator +home() block copyright include partial/copyright
执行下面的命令后再重新发布1
npm install --save hexo-renderer-jade hexo-generator-feed hexo-generator-sitemap hexo-browsersync hexo-generator-archive
1 | { |