wenmo8 发布的文章

程序中报 "char *" 类型的实参与 "LPWSTR" 类型的形参不兼容C/C++(167) 错误
#include
#include

int main(int argc, char* argv[])
{
char szCommandLine[] = "cmd";
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;

si.dwFlags = STARTF_USESHOWWINDOW; // 指定wShowWindow成员有效
si.wShowWindow = TRUE; // 此成员设为TRUE的话则显示新建进程的主窗口,
// 为FALSE的话则不显示
BOOL bRet = ::CreateProcess (
NULL, // 不在此指定可执行文件的文件名
szCommandLine, // 命令行参数
NULL, // 默认进程安全性
NULL, // 默认线程安全性
FALSE, // 指定当前进程内的句柄不可以被子进程继承
CREATE_NEW_CONSOLE, // 为新进程创建一个新的控制台窗口
NULL, // 使用本进程的环境变量
NULL, // 使用本进程的驱动器和目录
&si,
&pi);

if(bRet)
{
// 既然我们不使用两个句柄,最好是立刻将它们关闭
::CloseHandle (pi.hThread);
::CloseHandle (pi.hProcess);

printf(" 新进程的进程ID号:%d \n", pi.dwProcessId);
printf(" 新进程的主线程ID号:%d \n", pi.dwThreadId);
}
return 0;
}

解决办法
方法一、把工程设置里去掉UNICODE宏定义

项目->XXX属性->配置属性->常规->字符集 , 由使用Unicode字符集 改为 使用多字节字符集

方法二、在程序的开头加上 #undef UNICODE

安装memcached需要先安装libmemcached

一,安装libmemcached

1,下载 : https://launchpad.net/libmemcached/+download

2,安装 : tar -zxf .... cd ....  ./configure --prefix=/usr/local/related/libmemched   make && make install

二,安装memcached

1,下载:http://pecl.php.net/package/memcached

2,安装:tar -zxf ...... cd .... 安装它需要指定php-config与libmemcached的地址(如果它没有安装在默认地址)

./configure --prefix=/usr/local/related/memcached-3.0.4 --with-php-config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/local/related/libmemcached-1.0.18/

可能会报一个错:

configure: error: no, sasl.h is not available. Run configure with --disable-memcached-sasl to disable this check

可以根据提示指定--disable-memcached-sasl 解决,也可以安装这个sasl文件:

To solve this issue with CentOS, you should be able to run:

yum install cyrus-sasl-devel

FYI, this question refers to CentOS, but for Ubuntu, the following should work:

sudo apt-get install libsasl2-dev

再次安装如果报错:

configure: error: no, libmemcached sasl support is not enabled. Run configure with --disable-memcached-sasl to disable this check

这是因为安装libmemcached时没有开启sasl支持

所以重新安装libmemcached

./configure --prefix=/usr/local/related/libmemcached --enable-sasl

 三,安装memcached服务

上面安装了php的memcached扩展后安装memcached服务

memcached服务器
memcached
下载地址http://memcached.org/
wget下载路径http://www.memcached.org/files/memcached-1.4.25.tar.gz
这里用到的是
memcached-1.4.25.tar.gz


memcached基于libevent的事件处理:libevent是个程序库,他将Linux 的epoll、BSD类操作系统的kqueue等时间处理功能封装成统一的接口。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能
libevent
下载地址http://libevent.org/
wget下载路径http://jaist.dl.sourceforge.net/project/levent/release-2.0.22-stable/libevent-2.0.22-stable.tar.gz
这里用到的是
libevent-2.0.22-stable.tar.gz


用 WinSCP上传到指定的目录下,这里是
/usr/local/src


shell端
查询系统是否已安装libevent
RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序”
-i            :install 安装
-v            :显示详细信息
-vv           :显示更加详细的信息
-h            :使用#显示安装进度
-U            :软件存在则升级软件,不存在则安装软件
-F            :软件存在则升级软件,不存在则不做任何动作
-e            :程序卸载--nodeps  不卸载相关依赖包,可能导致其他软件无法使用
-q            : 查询某个包是否安装
--test        :仅测试是否可以安装,但是不进行安装
--nodeps      :不考虑依赖关系进行安装,可能造成软件无法正常使用
--force       :忽略软件包及文件的冲突
--replacepkge :无论软件包是否已被安装,都强行安装软件包
--replacepkgs :重新安装软件包,如原有配置文件存在,可能无法覆盖
如下参数只能配合-q组合使用如-qa在所有已安装包中查询是否安装某个包
-a, --all      : 查询/验证所有包
-p, --package  : 查询/验证包文件
-l, --list     : 查询包中的列表文件
-d, --docfiles : 查询列表所有文档文件
-f, --file     : 查询/验证包拥有的文件
例rpm -ivh zsh-4.3.10-4.1.el6.x86_64.rpm安装zsh-4.3.10-4.1.el6.x86_64.rpm并显示详细信息和安装进度
|grep 搜索命令的输出中是否包含某个字符串,加亮显示(这里是-qa命令输出的字符串中查找)
这里显示libevent-2.0.21-4.el7.x86_64,说明已安装libevent-2.0.21-4.el7.x86_64
rpm -qa|grep libevent


卸载已安装的libevent
rpm -e libevent-2.0.21-4.el7.x86_64


进入到安装包目录
cd /usr/local/src


解压缩libevent到当前文件夹
tar -zxvf libevent-2.0.22-stable.tar.gz


进入解压缩目录
cd libevent-2.0.22-stable


配置安装目录
./configure --prefix=/usr/local/libevent


编译
make


安装
make install


返回上级目录
cd ../


解压缩memcached到当前文件夹
这个压缩包没有用gzip格式压缩  所以解压的时候也不用加上z,直接 tar -xvf 就可以了
tar -xvf memcached-1.4.25.tar.gz


进入解压缩目录
cd memcached-1.4.25


配置安装目录,及关联的libevent库安装目录
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent


编译
make


安装
make install


创建文件夹用来保存memcached的进程文件
mkdir -m777 -p /usr/local/memcached/pid


启动memcached
-d  选项是启动一个守护进程。
-u  表示启动memcached的用户,这里为root,可以指定低权限用户启动memcached。
-m  是分配给Memcache使用的内存数量,单位是MB,默认64MB。内容容量达到指定的值之后memcached回自动删除不适用的缓存
-p  是设置Memcache的TCP监听的端口,最好是1024以上的端口,memcached默认端口11211。
-c  选项是最大运行的并发连接数,按照服务器的负载量来设定,默认是1024。
-P  是设置保存Memcache的pid文件,也就是保存进程ID到指定文件,只有在使用 -d 选项的时候才有意义。
-vv 输出详细信息
也可以启动多个守护进程,但是端口不能重复。这样就可以在一台机器上相当拥有多个Memcached服务器
/usr/local/memcached/bin/memcached -d -m 256 -u root -p 11211 -c 1024 -P /usr/local/memcached/pid/memcached.pid -vv


杀死memcached进程
kill `cat /usr/local/memcached/pid/memcached.pid`


/*
或者可以查看11211端口使用情况获取使用进程ID
lsof -i:11211


直接用kill 进程ID 来杀死进程,这里memcached的进程ID是20146
kill 20146
*/


将memcached放到service控制中将下面代码新建保存到/etc/init.d/memcached中
#!/bin/bash
# memcached MemCached
# it is v.1.4.25 version.
# chkconfig: - 85 15
# description: memcached is very good
# processname: memcached
MEMCACHED="/usr/local/memcached/bin/memcached"
PID_FILE="/usr/local/memcached/pid/memcached.pid"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
start()
{
    $MEMCACHED -d -m 256 -u root -p 11211 -c 1024 -P ${PID_FILE}
}
stop()
{
    kill `cat $PID_FILE`
}
restart(){
    stop
    start
}
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        sleep 3
        start
        ;;
    *)
    echo $"Usage: 0 {start|stop|restart}"
    exit 1
esac
exit 0
:wq  保存并退出
vim /etc/init.d/memcached


设置文件的访问权限
chmod 755 /etc/init.d/memcached


可以使用service控制memcached启用关闭了
service memcached start


让memcached服务加入到开机启动指令管理的服务列表中
chkconfig --add memcached


设置开机启动
chkconfig memcached on


开启防火墙11211端口的外部访问
firewall-cmd --zone=public --add-port=11211/tcp --permanent


重启防火墙
firewall-cmd --reload

附
linux启动memcached选项
-p   : 监听的TCP端口(默认: 11211)
-U   : 监听的UDP端口(默认: 11211, 0表示不监听)
-s   : 用于监听的UNIX套接字路径(禁用网络支持)
-a   : UNIX套接字访问掩码,八进制数字(默认:0700)
-l   : 监听的IP地址。(默认:INADDR_ANY,所有地址)
-d   : 作为守护进程来运行。
-r   : 最大核心文件限制。
-u   : 设定进程所属用户。(只有root用户可以使用这个参数)
-m   : 单个数据项的最大可用内存,以MB为单位。(默认:64MB)
-M   : 内存用光时报错。(不会删除数据)
-c   : 最大并发连接数。(默认:1024)
-k   : 锁定所有内存页。注意你可以锁定的内存上限。试图分配更多内存会失败的,所以留意启动守护进程时所用的用户可分配的内存上限。(不是前面的 -u  参数;在sh下,使用命令"ulimit -S -l NUM_KB"来设置。)
-v   : 提示信息(在事件循环中打印错误/警告信息。)
-vv  : 详细信息(还打印客户端命令/响应)
-vvv : 超详细信息(还打印内部状态的变化)
-h   : 打印这个帮助信息并退出。
-i   : 打印memcached和libevent的许可。
-P   : 保存进程ID到指定文件,只有在使用 -d 选项的时候才有意义。  
-f   : 块大小增长因子。(默认:1.25)
-n   : 分配给key+value+flags的最小空间(默认:48)
-L   : 尝试使用大内存页(如果可用的话)。提高内存页尺寸可以减少"页表缓冲(TLB)"丢失次数,提高运行效率。为了从操作系统获得大内存页,memcached会把全部数据项分配到一个大区块。
-D   : 使用  作为前缀和ID的分隔符。这个用于按前缀获得状态报告。默认是":"(冒号)。如果指定了这个参数,则状态收集会自动开启;如果没指定,则需要用命令"stats detail on"来开启。
-t   : 使用的线程数(默认:4)
-R   : 每个连接可处理的最大请求数。
-C   : 禁用CAS。
-b   : 设置后台日志队列的长度(默认:1024)
-B   : 绑定协议 - 可能值:ascii,binary,auto(默认)
-I   : 重写每个数据页尺寸。调整数据项最大尺寸。

SAP 中的LT
本人开始转行到SAP开发
2020-10-24 14:48:31
sap开发核心语言ABAP
有套视频大概一个多月可以入门,
我发现自学一个东西真的很有意思,每天下班后闭关修炼,加成自己,多年后你就是大神,你还怕没收入吗?咳咳有点说多了下面,我随便记录一下自己的学习比较毕竟散,我是用来自己看的。

FI 财务报表
co成本控制
sd销售模块
mm 物料管理
pp生产模块

abap开发模块
basis 补丁,硬件
pm 工厂管理
ps项目管理
QM质量管理
数据字典是一个工具,和新华字典类似
数据字典点主要功能为保证数据点完整性,一致性,安全性。
结构是什么?
结构就是有系列的字段组成
元素是什么?
元素就是单独点一些数据
数据类型是数据结构中的定义是一个值的集合以及定义在这个值集上的一组操作。在SAP中,数据类型有3种:

Data element:最基本的数据单位,没有结构,定义了数据的描述,数据类型和长度等其他特征。
Structure:由数据元素或者其他的数据类型组成的一个特定结构。
Table type:table类型的数据元素,可存放多行数据。
LIKE???LINE?OF
数据字典定义点表不是直接创建一个物理表,而是在中间层创建一个表,创建完成后它自动的在后台创建一个物理表
abap数据字典的基本对象,表,视图,数据类型,域,搜索帮助,锁对象。六大对象。
database-vice数据库视图
Projection -view投影视图
Maintenance view维护视图
Help view帮助视图
SAP
SE16:专门看表数据的。
SM30:查看视图数据的。
SAP数据类型
程序命名GUI法
以Z开头
报表是ZR
接口是I
打印是F
快速调整字体大小 Ctrl + 鼠标滚轮
剪切一行 Ctrl + Shift + X
删除一行 Ctrl + Shift + L
复制一行 Ctrl + Shift + T
转成小写 Ctrl + L
转成大写 Ctrl + U
大小写相互转换 Ctrl + K
取消 Ctrl + Z
重做 Ctrl + Y
原地复制一行 Ctrl + D
tableType:表类型。
我的程序
ZOROGRAM_F0029

Z51SAP_CAO
表格维护生成器
1.SE54
2.在se11表格中实用程序中选择维护生成器
权限组指点是查看的权限,选择无权限,函数组只要给个名字就可以了。
数据库视图
其中数据库视图主要是用来查数据的。
维护视图专门用来维护数据
LOC锁:
释放锁DEQ
加锁:ENQ

语法:
数据类型缩写
DECIMALS x表示小数 位。
C:文本型,默认长度为1,默认值为 space(空).
D: 日期型,默认长度8 允许长度8 ,默认值为 00000000 ,格式为 YYYYMMDD.
F:浮点型,默认长度8 允许长度8 ,默认值为 0.
I:整型,默认长度4 允许长度10 ,默认值为 0
N: 数值型,默认长度1允许长度31 ,默认值为 ‘00000000’ 表示存储数值类型的字符串。
P:压缩型,默认长度8 允许长度16 ,默认值为 0,将两个十进制数字压缩到1个字节注意如果需要存储小数必须指定小数的个数。
T:时间类型,默认长度6 允许长度6 ,默认值为 ‘000000’ 时间。
P型小数点要使用DECIMAL声明小数位n.
变量定义;DAta:后面跟name

like用在已经定于好的数据类型

type用在定义数据类型。

常量定义:constants;name
打印关键词 WRITE
move-corresponding 用于结构赋值,仅复制相同名称的字段

=赋值是基本赋值

WRITE xx(数据源) to xx(赋值对象)。

move xx to xx(同上)。
c类型转N类型只保留数值,其他忽略。

C类型不能直接转行I类型需要通过N类型转换。

小数位赋值时一定要“”否则系统不知道你中间那个点是结束还是什么。

系统常量的意思:
SY-SUBRC:语句执行后的返回值,0表示成功
SY-DATUM:当前服务器日期
SY-UZEIT:当前服务器时间
SY-ULINE:255长度的水平线
SY-VLINE:垂直线 SY-INDEX:循环说执行的次数
SY-TABIX:内表循环的次数
SY-DYNNR:当前Screen号
SY-MANDT:当前登录的Client号
SY-STEPL:返回当前操作的屏幕行号(Table Control)
SY-LOOPC:当前表格控件在屏幕中的总行数(Table Control)
SY-UCOMM:PAI所出发的功能代码
SY-DYNNR:当前屏幕号
SY-MSGID:Message Class
SY-MSGNR:Message Number
SY-MSGTY:Message Type
SY-MSGV1~4:Message Variant
SY-LINCT:REPROT语句中设定的LINE-COUNT
SY-LINSZ:REPROT语句中设定的LINE-SIZE
SY-SROWS:当前窗口的列表行数
SY-SCOLS:当前窗口的列表栏目数
SY-PAGNO:当前页的页码
SY-LINNO:当前选定行的行号
SY-COLNO:当前选定列的列号
SY-LSIND:当前列表索引,第一级列表为1
SY-LILLI:选择某行时光标行位置
SY-CUROW:选择某行时光标列位置
SY-REPID:返回当前程序名
MOVE-CORRESSPONDING to :此表达的是:
各种符号意思:
+
/

mod(除法的一种取余)
=或EQ(等于)
<>或><或者 NE(不等于)
<或LT(小于)

或GT(大于)
<=或LE(小于等于)
=或GE(大于等于)
逻辑运算符号
AND 且。
OR 或。
not 非。
移位
关键词
SHIFT XX(数据源) by x(整数需要移动多少位) PLACES (默认往left(左)移动right(右))
指定字符串c从c1位置开始移位。
shift c(数据源)up to c1(指定的位置)
write sy-subrc(检查是否成功,成功返回0否则返回4)

移除字符串c左边/右边的子字符串c1:
SHIFT c LEFT/RIGHT DELETING LEADING/ TRAILING c1

把‘abcdefg’中的abc替换成123
REPLACE ‘ABC’ WITH ‘123’ INTO ‘ABCDEFG’.
去除所有空格
condense (数据源) no-GAPS.

查找某个字符串
SEARCH (数据源) for(目标数据)

TYPE STANDARD TABLE OF定义标准内表

什么叫执行语句
除了定义点语句其他语句都叫执行语句。

条件控制语句
DATA: lv_number type int2.
DATA lv_result TYPE int2.
lv_number = 7.
lv_result = lv_number mod 2.
write: sy-uline.
IF lv_result = 0.
WRITE:/,‘偶数’.
else.
write:/,‘基数’.
ENDIF.

CLEAR 内表。
清除变量内容
常量不能被清空

CONTINUE:无条件终止当前循环,直接执行下一次循环
CHECK: 有条件终止当前循环
EXIT:终止所有循环

PERFORM作用是用来调用封装的代码。

WITH HEADER LINE这是一个旧bai说法,定义内表的时du候,你可以指定是否创建一个zhi同名的表头(工作区)
内表

内存中建立的临时表。

内表有三种类型

1standard:标准表

2sorted:排序表

3hashed:哈希表

共同点:

都可以对内存的数据进行插入,删除,修改操作
不同点:

标准表:在插入数据时并不对数据行的地址进行重新排序存储。

排序表:在增加和插入时要对数据存储的地址进行重新排序。

哈希表:只能通过关键字进行访问,在检索数据里与数据行数无关。

内表的初始化:CLEAR只能清空工作行。

数据库插入只有一个insert关键字

内表有三个关键字

insert插入一行或者多行数据。

append也是表示插入,内表仅用于存储数据,可以进行附加。

collect也是表示插入,内表去重复,统计字段之和。

initial:表示空行

SPLIT <需要拆分的程序> AT <拆分条件> INTO h1…hn(h为变量名称使用空格隔开)。

使用"LOOP … ASSIGNING …"可以直接修改内表中的数据,而不需要先将内表数据复制到相应工作区,然后再更新回去,性能提高。

BREAK-POINT.表示断点

参考定义
DATA: itab4 like itab1.“参考已定义的内表”
data: itab6 TYPE TABLE OF (数据库表名称).“参考数据库表定义内表”
DATA: itab7 TYPE STANDARD TABLE OF zschange.“参考表结构定义内表”
*排序表,哈希表
DATA itab8(内表名称) TYPE SORTED TABLE OF 数据库表名称 WITH UNIQUE KEY 关键字(数据库字段).“排序表”
DATA itab9(内表名称) TYPE HASHED TABLE OF 数据库表名称 WITH UNIQUE KEY carrid.“数据库字段”
*定义工作区
DATA:ls_itab1 type ty_inab1.

WITH HEADER LINE 此关键词就是在定义内表的时候定义一个名字相同的工作空间,(旧方法)。

通过DESCRIBE获得内表的行
DESCRIBE TABLE LINES n
DESCRIBE?TABLE?emp?LINES?n1.???"表中无数据,回执为0.

内表处理
*添加条目
ls_itab1-field1 = ‘00001’.
ls_itab1-field2 = 00001.
INSERT ls_itab1 INTO itab1 INDEX 1.
APPEND ls_itab1 to itab1 .
COLLECT ls_itab1 INTO itab1.
添加条目排序表
ls_itab1-field1 = ‘00001’.
ls_itab1-field2 = 00001.
INSERT ls_itab1 INTO itab8 INDEX 1.
APPEND ls_itab1 to itab8 .
COLLECT ls_itab1 INTO itab8.
添加一个内表到另一个内表中
append lines of itab1 to itab2.
append lines of itab1 FROM 1 to 2 to itab2.
INSERT LINES OF itab1 to itab2.
DELETE TABLE itab WITH TABLE KEY k1=v1…kn=vn.

按具体值删除

DELETE TABLE itab [FROM wa].

参照其它内表值删除

DELETE itab INDEX idx.

删除具体行数据

DELETE itab FROM idx1 TO idx2.

删除具体行数范围间数据

DELETE ADJACENT DUPLICATES FROM itab.

删除重复数据,执行此条件前必须先排序

BOOK1[] = BOOK[].内表赋值给内表。

APPEND INITIAL LINE TO

排序
sort itab(名称) [by f1 f2…fn]
sql
SELECT语法结构:
SELECT FROM
?INTO
WHERE
GROUP BY
ORDER BY

其中各关键字的属性描述如下:
SELECT :具体的查询字段。
SELECT SINGLE:定义单行查询。
FROM :所查询的透明表。
INTO :查询结果赋值对象,赋值到具体表或结构体。
INTO (…):将查询结果赋值到具体字段。
INTO CORRESPONDING FILES OF :将查询结果按字段匹配赋值给具体的内表或者结构体。
WHERE :查询条件。
GROUP BY :分组查询条件。
ORDER BY :排序条件。

使用SELECT…ENDSELECT语法能循环读取及操作查询
通过系统参数SY-DBCNT可以获取当前读取数据的行数
COUNT():统计查询总数
SUM():统计表中某个数值字段的总和
AVG():统计表中某个数值字段的平均值
MAX():统计表中某个字段的最大值
MIN() :统计表中某个字段的最小值。

IKE LINE OF后面接一个内表,表示一个DATA参数具有和内表一样的结构(structure),例如有一个TABLES:Z_USER,Z_USER有两个字段,一个ID,一个NAME,那么

DATA:WA LIKE LINE OF Z_USER 表示WA和Z_USER的STRUCTURE一样,可以吧WA当做Z_USER的WORK AREA来用。

LIKE TABLE OF 后面接一个STRUCTURE,表示一个DATA参数是一个内表,这个内表的结构和后面接的那个结构一样,

与alv事件相关事务代码
se37
REUSE_ALV_EVENTS_GET
常用事物
user_command 客户响应

top_of_page 标题栏的设置

pf_status_set 工具栏设置

调用alv显示:REUSE_ALV_EVENTS_GET(在工具模式中输入以上函数)

判断内表是否为空的语句为:
IF IT_DATA IS INITIAL. "如果内表为空

*执行体

ENDIF.

IF NOT IT_DATA IS INITIAL. "如果内表不为空

*执行体

ENDIF.
lav事件常用的
user_command

top_of_page

pf_status_set

rrc远程函数

使用CALL FUNCTION 语句调用方法函数注意函数名称必须是大写而且要用单引号包裹例子:

CALL FUNCTION ‘BC400_MOS_POWER’

EXPORTING表示输入参数的关键字。

IMPORTING表示输出参数的结果关键字。

se80叫做对象开发浏览器,可以查看所有的开发对象。

补充前导零的函数:‘CONVERSION_EXIT_ALPHA_INPUT’。

内存有两种,一种是sap内存,一种是abap内存,

sap内存要比abap中的内存要大。

sap内存不管你打开了多少个窗口,所有的内存都是共享的,

abap只是针对一个进程进行内存共享,如果一个用户开启多个窗口其中内存不是共享的,

CALL TRANSACTION ‘’.在同一个程序中调用另一个程序的语法。

还可以使用submit {程序名称}

abap内存共享成功需要他们定义的变量名称要一致才行。

DEFAULT 此关键词是设置默认值的意思。

MEMORY ID 往sap内存中设置默认值。

AS CHECKBOX 复选框关键字 长度只能唯一超过就报错,复选框如果选中对应的值是大写的X 否则就是空格。

RADIOBUTTON GROUP{名称}单选框,所以在书写的时候最少需要两个元素才能使用,当然可以定义多组单选框以名称为分组。

AS LISTBOX 下拉菜单。

VISIBLE LENGTH 10显示长度,我们肉眼能看到的长度并不是输出参数的长度。

SELECT-OPTIONS name for(参考)data_object
.
name 为选择选项的名称

data_object是一个预定义的变量,或者数据库表的字段。

SELECT-OPTIONS是当做内表来进行的包含四列 sing (符号),optin(比较符号),low(最小值),high(最大值)

它定义的类型是char2只能是字母来表达。

types 声明表。

调试的时候出现帽子一样的图标表示他是一个内表。

no INTERVALS 表示所有的选择元素都只有一个输入项。

屏幕事件就是点击某一个按钮触发不同的事件表示不同的功能。

INTO CORRESPONDING FIELDS OF的作用:匹配工作区
,(INTO CORRESPONDING FIELDS OF TABLE的作用是:表字段名转换在查询过程中我们通常会遇到这样的情况,将透明表查询值直接传递给内表:

两表中字段结构一样,但字段名称却不同

通常的情况下将字段名称设为一致的

除此之那还可以用AS关键字,就像SQL中的用法一样

程序有五种程序:可执行程序,模块池程序都可以插入屏幕,函数程序,接口程序,子程序。)

对话屏幕:客户操作之后和程序进行交互叫对话屏幕,

跟程序显示相关的程序都在pbo里边,用户触发了某一个事件,我们要进行响应这部分逻辑流写在了pai里边

LEAVE PROGRAM.退出屏幕。

LEAVE SCREEN:退出当前屏幕。

concatenate表示字符串拼接的意思。

在查询过程中我们通常会遇到这样的情况,将透明表查询值直接传递给内表:

两表中字段结构一样,但字段名称却不同

通常的情况下将字段名称设为一致的

除此之那还可以用AS关键字,就像SQL中的用法一样

*这个意思是新语法,不用自己再创建内表或者工作空间它自动创建

INTO TABLE @DATA(lt_zsdt02_021)

*FOR ALL ENTRIES IN这是一个固定写法,以内表中的某些字段为条件在数据库中取数,我们一般bai使用for all entries in 语句将该表与内du表串联。

FOR ALL ENTRIES IN @gt_item

WHERE zvbeln EQ @gt_item-zvbeln.

select single?single选取的数据要放到 工作区中,而不能放到表中。

INTO TABLE与APPENDING TABLE的区别 从字面看好像作用是相同的,但具体使用以来还是有区别的。

如果都是从数据库表中select一次数据,添加到内表中,他们的作用相同;

但是多次,他们的作用则有很大差别,INTO TABLE:将数据select出来添加到内表时会将内表先清空再添加,

而APPENDING TABLE则会直接追加,实现累计效果。

程序二:
LOOP AT it_marc.

it_marc-dispo = ‘G00’.

it_marc-plifz = 5.

MODIFY it_marc TRANSPORTING dispo plifz.

ENDLOOP.
程序二使用了TRANSPORTING子句,
更新内部表记录时仅更新DISPO,PLIFZ两个字段.

CALL METHOD

特殊符号 &表示拼接字符串代码如下:
DATA name(300) TYPE c VALUE 'spfli AS p ’
& ’ INNER JOIN sflight AS f ’
& ‘ON p~carrid = f~carrid and p~connid = f~connid’ &
'inner join sbook as b ’ &
‘ON b~carrid = f~carrid AND b~connid = f~connid AND b~fldate = f~fldate’.

abap 命名规范
数据定义(data definitions):

type类型 : TY_

全局变量 GV_

局部变量 LV_

全局工作区GS_

本地工作区: LS_

全局内表:GT_

局部内表: LT_

指针(field symbols):

本地结构:<LFS_*>

全局结构:<GFS_*>

功能模块:

输入参数:IV_ eg: IV_MATERIAL

输出参数): EV_

changing-parameter :CV_

表 :T_* eg:T_MATERIAL

类 (Class) :

输入参数:IV_ eg: IV_MATERIAL

输出参数: EV_

changing-parameter :CV_

结果 : RV_

异常 :ZCX_ eg: ZCX_ERROR

Parameter : P_*

Select-Options : S_*

Range Field : R_*

Interface : ZIF_*

LOOP … ASSIGNING …的使用

表示指针指向的地址。

Field-Symboles: like ITAB.

LOOP AT ITAB ASSIGNING .

I = SY-TABIX MOD 2.

IF I = 0.

<WA>-FLAG = 'X'.

ENDIF.

ENDLOOP.

事件
双击事件:&IC1
SKIP FIRST SCREEN意思是:跳过第一个屏幕。

REF TO(参考)用来定义类和接口。

触发异常:
Raise.
如果在function的调用中指定异常,控制直接返回调用程序。

如果未列出该异常,则程序会因运行是错误而终止。

变式是什么:
这个我不清楚确切的定bai义,但du根据我以往用的情况,这个变式多半是zhi指,你自己设定的特殊格式和内容。

比dao如你在使用一个报表时,你常用几个信息,你就可以将这些信息输入后,点那个小框框(变式),

保存一个名字,下次你再用的时候,可以直接将你保存的名字输入,就不必一个一个的重新填写了。
massge 类型 E类型就是在屏幕下方出现提示,I类型就是弹出一个提升框。
instance 级别,叫做实例属性 必须要创建一个对象接受才能拿来用。
constant 常量级别,可以当作静态属性来用。
判断对象是否创建成功 使用关键字 is bound (是否被绑定)。

1、开发平台

虚拟机:VMware 12

操作系统:Ubuntu 14.04 64bit

2、准备ARM交叉编译工具包

编译uboot和linux kernel都需要ARM交叉工具链支持,这里使用Linaro提供的交叉编译工具。下载地址为:http://releases.linaro.org/

注意:如果主机是64bit,请选择64位的交叉编译器工具链,32bit的主机选择32位的交叉工具链。

The Linaro Toolchain Working Group is pleased to announce this quarter’s release of the Linaro Toolchain Binaries, a pre-built version of Linaro GCC and Linaro GDB that runs on generic Linux or Windows and targets the glibc Linaro Engineering Build.

Beginning 2014.11, Linaro is changing the layout and structure of its prebuilt toolchain binary releases. 2014.11 is the first release built with ABE, adding more maintainable code base and automatic testing. For further details on ABE, please visit https://wiki.linaro.org/ABE.

The folder names above describe the target triplets, i.e. the system on which you want your programs/applications to run. For more details on triplets, please click here.

Inside each folder is also a manifest.txt file further describing the target and host systems meant for the toolchain, plus source component versions.

Essentially, the main folder contents are as follows:

aarch64-linux-gnu

· gcc-linaro-*x86_64_aarch64-linux-gnu.tar.xz

o Linux 64-bit binaries for the Aarch64 Linux cross-toolchain

· gcc-linaro-*i686-mingw32_aarch64-linux-gnu.tar.xz

o Windows 32-bit binaries for the Aarch64 Linux cross-toolchain

aarch64-none-elf

· gcc-linaro-*x86_64_aarch64-elf.tar.xz

o Linux 64-bit binaries for the Aarch64 bare-metal cross-toolchain

· gcc-linaro-*i686-mingw32_aarch64-elf.tar.xz

o Windows 32-bit binaries for the Aarch64 bare-metal cross-toolchain

aarch64_be-linux-gnu

· gcc-linaro-*x86_64_aarch64_be-linux-gnu.tar.xz

o Linux 64-bit binaries for the Aarch64 Linux Big Endian cross-toolchain

· gcc-linaro-*i686-mingw32_aarch64_be-linux-gnu.tar.xz

o Windows 32-bit binaries for the Aarch64 Linux Big Endian cross-toolchain

aarch64_be-none-elf

· gcc-linaro-*x86_64_aarch64_be-elf.tar.xz

o Linux 64-bit binaries for the Aarch64 bare-metal Big Endian cross-toolchain

· gcc-linaro-*i686-mingw32_aarch64_be-elf.tar.xz

o Windows 32-bit binaries for the Aarch64 bare-metal Big Endian cross-toolchain

arm-linux-gnueabi

· gcc-linaro-*x86_64_arm-linux-gnueabi.tar.xz

o Linux 64-bit binaries for the ARMv7 Linux soft float cross-toolchain

· gcc-linaro-*i686-mingw32_arm-linux-gnueabi.tar.xz

o Windows 32-bit binaries for the ARMv7 Linux soft float cross-toolchain

arm-linux-gnueabihf

· gcc-linaro-*x86_64_arm-linux-gnueabihf.tar.xz

o Linux 64-bit binaries for the ARMv7 Linux hard float cross-toolchain

· gcc-linaro-*i686-mingw32_arm-linux-gnueabihf.tar.xz

o Windows 32-bit binaries for the ARMv7 Linux hard float cross-toolchain

arm-none-eabi

· gcc-linaro-*x86_64_arm-eabi.tar.xz

o Linux 64-bit binaries for the ARMv7 bare-metal cross-toolchain

· gcc-linaro-*i686-mingw32_arm-eabi.tar.xz

o Windows 32-bit binaries for the ARMv7 bare-metal cross-toolchain

armeb-linux-gnueabihf

· gcc-linaro-*x86_64_armeb-linux-gnueabihf.tar.xz

o Linux 64-bit binaries for the ARMv7 Linux Big Endian hard float cross-toolchain

· gcc-linaro-*i686-mingw32_armeb-linux-gnueabihf.tar.xz

o Windows 32-bit binaries for the ARMv7 Linux Big Endian hard float cross-toolchain

armeb-none-eabi

· gcc-linaro-*x86_64_armeb-eabi.tar.xz

o Linux 64-bit binaries for the ARMv7 bare-metal Big Endian cross-toolchain

· gcc-linaro-*i686-mingw32_armeb-eabi.tar.xz

o Windows 32-bit binaries for the ARMv7 bare-metal Big Endian cross-toolchain

NOTE

· The binary source package is no longer distributed as the components are now archived at http://abe.tcwglab.linaro.org/snapshots and downloaded automatically based on manifest.txt when (re)building with ABE.

· The source package releases for the individual components are still at http://releases.linaro.org/latest/components/toolchain. Select the component (e.g. gcc, glibc, binutils, gdb) as necessary.

· The binary tarball has been splitted into 3 parts. As a result, you can install only the parts needed:

o gcc-linaro-*.tar.xz – the compiler and tools

o runtime-linaro-*.tar.xz – runtime libraries needed on the target

o sysroot-linaro-*.tar.xz – sysroot (a set of libraries and headers to develop against)

· Beginning 2014.11, sysroots will use the latest glibc release provided by Linaro engineers in order that users get the latest features and optimizations in the system libraries.

· Eglibc 2.15 compatible sysroots will no longer be released. Users that require Eglibc 2.15 sysroots that need the latest Linaro GCC compiler should use the previous quarterly released sysroot.

· x86 (32-bit) Linux host toolchains are no longer provided. x86_64 (64-bit) Linux host toolchains are provided instead.

· Soft-float targeted toolchains are no longer supported.

笔者使用的ARM交叉工具链版本为gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi.tar.xz

下载地址为:

http://releases.linaro.org/components/toolchain/binaries/6.1-2016.08/arm-linux-gnueabi/gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi.tar.xz

3、安装步骤

3.1、Ubuntu14.04 64bit系统下安装标准的C开发环境

sudo apt-get install gcc g++ libgcc1 libg++ make gdb

或者 sudo apt-get install build-essential

3.2、下载gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi.tar.xz

1> 在/usr/local/文件夹下建立名为ARM-toolchain的文件夹

$ sudo mkdir /usr/local/ARM-toolchain

2> 下载gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi.tar.xz

$ cd /usr/local/ARM-toolchain

sudo wget http://releases.linaro.org/components/toolchain/binaries/6.1-2016.08/ arm-linux-gnueabi/gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi.tar.xz

3.3、安装gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi

解压gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi.tar.xz

$ xz –d gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi.tar.xz

$ tar xvf gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi.tar

3.4、修改环境变量,把交叉编译器的路径加入到PATH

修改/etc/bash.bashrc文件(此文件只对当前用户适用)

$sudo gedit /etc/bash.bashrc

然后在文件的末尾空白处加入一下代码:

Add ARM toolschain path

if [ -d /usr/local/ARM-toolchain/gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi ] ; then

PATH= /usr/local/ARM-toolchain/gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi/bin:"${PATH}"

fi

3.5、使新的环境变量生效(不用重启电脑)

$ source /etc/bash.bashrc

3.6. 检查是否将路径加入到PATH:

$ echo $PATH

若显示的内容中含有:/usr/local/ARM-toolchain/gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi/bin 说明已经将交叉编译器的路径加入PATH。

至此,交叉编译环境安装完成。

3.7. 测试是否安装成功

$ arm-linux-gnueabi-gcc -v

执行上面的命令,显示arm-linux-gnueabi-gcc -v信息和版本:

$ arm-linux-gnueabi-gcc -v

Using built-in specs.

COLLECT_GCC=arm-linux-gnueabi-gcc

COLLECT_LTO_WRAPPER=/usr/local/ARM-toolchain/gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi/bin/../libexec/gcc/arm-linux-gnueabi/6.1.1/lto-wrapper

Target: arm-linux-gnueabi

Configured with: /home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg/target/arm-linux-gnueabi/snapshots/gcc-linaro-6.1-2016.08/configure SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libstdcxx-pch --disable-libmudflap --with-cloog=no --with-ppl=no --with-isl=no --disable-nls --enable-c99 --enable-gnu-indirect-function --with-tune=cortex-a9 --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=softfp --with-mode=thumb --disable-multilib --enable-multiarch --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg/target/arm-linux-gnueabi/_build/sysroots/arm-linux-gnueabi --enable-lto --enable-linker-build-id --enable-long-long --enable-shared --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu/arm-linux-gnueabi/libc --enable-languages=c,c++,fortran,lto --enable-checking=release --disable-bootstrap --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=arm-linux-gnueabi --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu

Thread model: posix

gcc version 6.1.1 20160711 (Linaro GCC 6.1-2016.08)

一、sd启动

将u-boot镜像写入SD卡,将SD卡通过读卡器接上电脑(或直接插入笔记本卡槽),通过"cat /proc/partitions"找出SD卡对应的设备,我的设备节点是/dev/sdb.(内存卡的节点)。

当有多个交叉编译器是,不方便设置环境变量时,可以在编译命令中指定交叉编译器,具体如下:在源码中操作以下步骤:

make distclean

make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- mrproper

make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- tiny210_config

make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- all spl

编译出tiny210-uboot.bin,注意交叉编译工具路径

执行下面的命令
$sudo dd iflag=dsync oflag=dsync if=tiny210-uboot.bin of=/dev/sdb seek=1

把内存卡插入开发板,使用串口工具设置环境变量:

setenv gatewayip 192.168.1.1 (电脑网关)
setenv ipaddr 192.168.1.102 (开发板ip,不要与虚拟机和电脑ip冲突)
setenv netmask 255.255.255.0
setenv serverip 192.168.1.10 (虚拟机ip)

saveenv

二、nand启动

烧写Uboot:

通过SD卡启动的u-boot for tiny210 将u-boot镜像写入nandflash

在虚拟机下重启tftp sudo service tftpd-hpa restart

开发板终端下执行下面的命令:

[FriendlyLEG-TINY210]# tftp 21000000 tiny210-uboot.bin

[FriendlyLEG-TINY210]# nand erase.chip

[FriendlyLEG-TINY210]# nand write 21000000 0 3c1f4 (写入长度)

内核的烧写位置是0x600000开始的区域,文件系统烧写位置为0xe00000开始的区域。

三、烧写内核:

重新设置环境变量:

setenv gatewayip 192.168.1.1 (电脑网关)
setenv ipaddr 192.168.1.102 (开发板ip,不要与虚拟机和电脑ip冲突)
setenv netmask 255.255.255.0
setenv serverip 192.168.1.10 (虚拟机ip)

saveenv

在/svn/linux-3.0.8 源码目录下make uImage,将uImage拷贝到tftp目录下

[FriendlyLEG-TINY210]#tftp 21000000 uImage          //下载文件到内存

[FriendlyLEG-TINY210]#nand erase 600000 f200000               //擦写相应的nand

[FriendlyLEG-TINY210]#nand write 21000000 600000 b03c280(写入长度) //写到nand

TFTP服务器配置:

sudo apt-get install xinetd

sudo apt-get install tftp-hpa tftpd-hpa

配置:

1: 在/etc/xinetd.d/目录下创建tftp配置文件

2: touch /etc/xinetd.d/tftp

3:

service tftp

{

socket_type = dgram

protocol = udp

wait = yes

user = root

server = /usr/sbin/in.tftpd

server_args = -s /var/tftpboot/

disable = no

per_source = 11

cps = 100 2

flags = IPv4

}

4: 创建tftp下载目录:

mkdir -p /var/tftpboot/

sudo chmod 777 /var/tftpboot

echo “iloveyou” >> /var/tftpboot/demo

测试:

tftp localhost

tftp 127.0.0.1

get demo

quit

四、启动参数

设置bootargs参数
1:如果用yaffs2文件系统
setenv bootargs noinitrd root=/dev/mtdblock4 rootfstype=yaffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M

设置自启动参数bootcmd 

setenv bootcmd nand read 21000000 80000 (nand起始地址)22e800 (nand写入长度)\; bootm 21000000

烧写命令如下:

[FriendlyLEG-TINY210]#tftp 21000000 rootfs_android.img            //下载文件到内存

[FriendlyLEG-TINY210]#nand erase e00000 f200000               //擦写相应的nand

[FriendlyLEG-TINY210]#nand write.yaffs 21000000 e00000 b03c280       //写到nand

记住yaffs镜像是包含OOB数据的,所以写入NAND Flash的数据长度应该是2112(=2048 + 64)字节的整数倍。

2:如果用NFS烧写文件系统
setenv bootargs root=/dev/nfs rw nfsroot=192.168.1.10(虚拟机ip):/home/xyp/nfsroot/rootfs ip=192.168.1.102(开发板ip):192.168.1.10(虚拟机ip):192.168.1.1:255.255.255.0::eth0:off console=ttySAC0,115200 init=/linuxrc

Setenv bootcmd nand read 21000000 600000 20b334 \; bootm 21000000

Saveenv

2.1 nfs配置

Sudo apt-get install nfs-kernel-server 配置nfs

Sudo vi /etc/exports添加/home/ly/nfs *(rw,sync,no_root_squash)

重启nfs服务,使配置生效:sudo /etc/init.d/nfs-kernel-server restart

2、构建根文件按系统
2.1、建立根文件系统目录
在/home/ly下创建目录system,新建建立根文件系统目录的脚本文件 create_rootfs_bash,使用命令sudo chmod +x create_rootfs_bash改变文件的可执行权限,./create_rootfs_bash运行脚本,就完成了根文件系统目录的创建。

文件系统目录脚本文件:

!/bin/sh

echo "------Create rootfs directons start...--------"
mkdir rootfs
cd rootfs

echo "--------Create root,dev....----------"
mkdir root dev etc boot tmp var sys proc lib mnt home usr
mkdir etc/init.d etc/rc.d etc/sysconfig
mkdir usr/sbin usr/bin usr/lib usr/modules

echo "make node in dev/console dev/null"

mknod -m 600 dev/console c 5 1
mknod -m 600 dev/null c 1 3
mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp

mkdir var/lib var/lock var/run var/tmp

chmod 1777 tmp
chmod 1777 var/tmp

echo "-------make direction done---------"

2.2建立动态链接库
动态链接库直接用友善之臂的,先解压友善之臂的根文件包,拷贝lib的内容到新 建的根文件目录lib内。
cd /opt/studyarm (压缩包存放位置)

tar –zxvf root_qtopia.tgz –C /opt/studyarm (输出目录)
cp –rf /opt/studyarm/root_qtopia/lib/* /home/ly/system/rootfs/lib/

2.3交叉编译Bosybox
Bosybox是一个遵循GPLv2协议的开源项目,它在编写过程总对文件大小进行优化,并考虑了系统资源有限(比如内存等)的情况,使用Busybox可以自动生成根文件系统所需的bin、sbin、usr目录和linuxrc文件。
1、解压busybox
cd /mnt/hgfs/share (压缩包存放位置)
tar –zxvf busybox-1.13.3.tar.tgz –C /opt/studyarm (输出目录)
2、进入源码,修改Makefile文件:
cd /opt/studyarm/busybox-1.13.3
修改:
CROSS_COMPILE ?=arm-linux- //第164行
ARCH ?=arm //第189行

3、配置busybox
输入make menuconfig进行配置
(1)、Busybox Settings--->
General Configuration--->
[*] Show verbose applet usage messages
[*] Store applet usage messages in compressed form
[*] Support –install [-s] to install applet links at runtime
[*] Enable locale support(system needs locale for this to work)
[*] Support for –long-options
[*] Use the devpts filesystem for unix98 PTYs
[*] Support writing pidfiles
[*] Runtime SUID/SGID configuration via /etc/busybox.config
[*] Suppress warning message if /etc/busybox.conf is not readable
Build Options--->

  [*] Build BusyBox as a static binary(no shared libs) 

[*] Build with Large File Support(for accessing files>2GB)
Installation Options->
[]Don’t use /usr
Applets links (as soft-links) --->
(./_install) BusyBox installation prefix
Busybox Library Tuning --->
(6)Minimum password legth
(2)MD5:Trade Bytes for Speed
[*]Fsater /proc scanning code(+100bytes)
[*]Command line editing
(1024)Maximum length of input
[*] vi-style line editing commands
(15) History size
[*] History saving
[*] Tab completion
[*]Fancy shell prompts
(4) Copy buffer size ,in kilobytes
[*]Use ioctl names rather than hex values in error messages
[*]Support infiniband HW
(2)、Linux Module Utilities--->
(/lib/modules)Default directory containing modules
(modules.dep)Default name of modules.dep
[*] insmod
[*] rmmod
[*] lsmod
[*] modprobe
-----options common to multiple modutils
[ ] support version 2.2/2.4 Linux kernels
[*]Support tainted module checking with new kernels
[*]Support for module .aliases file
[*] support for modules.symbols file

如果出现错误,直接找到相应的函数,取消该选项,在make menuconfig下用/查找,空格键添加/取消选项内容。

4、在busybox中配置对dev下设备类型的支持

mdev是busybox自带的一个简化版的udev,适合于嵌入式的应用埸合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件。在以busybox为基础构建嵌入式linux的根文件系统时,使用它是最优的选择。下面的选项将增加对mdev的支持。
Linux System Utilities --->

[*]Support /etc/mdev.conf          
[*]Support command execution at device addition/removal

5、编译busybox
编译busybox到指定目录:
cd /opt/studyarm/busybox-1.13.3
make CONFIG_PREFIX=/home/ly/system/rootfs install

在rootfs目录下会生成目录bin、sbin、usr和文件linuxrc的内容。

6、建立etc目录下的配置文件
1、etc/mdev.conf文件,内容为空。
2、拷贝主机etc目录下的passwd、group、shadow文件到rootfs/etc 目录下。
3、etc/sysconfig目录下新建文件HOSTNAME,内容为”LYliyan”。
4、etc/inittab文件:

etc/inittab

::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a –r
7、etc/init.d/rcS文件:

!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel

echo "----------munt all----------------"
mount -a

echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s

echo "*"
echo "*Studying ARM"
echo "Kernel version:linux-2.6.29.1"
echo "Student:Feng dong rui"
echo "Date:2009.07.15"
echo ""

/bin/hostname -F /etc/sysconfig/HOSTNAME
使用以下命令改变rcS的执行权限:
sudo chmod +x rcS
8、etc/fstab文件:

device mount-point type option dump fsck order

proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
mdev /dev ramfs defaults 0 0
9、 etc/profile文件:

Ash profile

vim:syntax=sh

No core file by defaults

ulimit -S -c 0>/dev/null 2>&1

USER="id -un"
LOGNAME=$USER
PS1='[\u@\h=W]#'
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH

10、制作根文件系统映像文件
使用以下命令安装好yaffs文件系统制作工具:
cd /mnt/hgfs/share
tar –zxvf mkyaffs2image.tgz –C /
在/opt/studyarm目录下,使用命令mkyaffs2image rootfs rootfs.img 生成根文件系统映像文件。

注意:

制作镜像提供的有两个工具,我的开发板是1G Flash的所以应该选用mkyaffs2image-128M的,选用mkyaffs2image会出现烧写文件系统不成功的错误。提供的文档中rootfs_rtm_210这个文件系统也是可用的