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这个文件系统也是可用的

随机映射使用 -P 参数时,Docker 会随机映射一个端口到内部容器开放的网络端口示例:docker run -d -P nginx

指定端口使用 -p 参数时,可以指定要映射的端口,并且在一个指定的端口上只可以绑定一个容器。支持的格式有:IP:HostPort:ContainerPortIP:ContainerPortHostPort:ContainerPort示例:将本机 8080 端口映射到容器的 80 端口:docker run -d -p 8080:80 nginx

查看端口映射docker port CONTAINER

DOCKER 给运行中的容器添加映射端口

方法1:
获得容器IP:
docker inspect container_name | grep IPAddress

iptable转发端口
iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000

方法2:
提交一个运行中的容器为镜像:docker commit containerid foo/live
运行镜像并添加端口:docker run -d -p 8000:80 foo/live /bin/bash

dede系统换LMXCMS 后模板风格切换不生效。经过分析调试
文件 lmxcms1.41\class\parse.class.php
构造函数

public function __construct(&$smarty){
    global $config;
    $this->config = $config;
    $this->smarty = $smarty;
    //修改smarty配置为前台
    defined('TEMDIR') || define('TEMDIR',$GLOBALS['public']['default_temdir']); //电脑模板目录
    defined('COMPILE_DIR') || define('COMPILE_DIR','index'); //电脑编译目录
    defined('COMPILE_CACHE_DIR') || define('COMPILE_CACHE_DIR','index'); //电脑编译缓存目录
    $this->smarty->template_dir = $this->config['template'].TEMDIR.'/'; //模板路径
    $this->smarty->compile_dir=$this->config['smy_compile_dir'].COMPILE_DIR.'/'; //编译文件路径
    $this->smarty->cache_dir = $this->config['smy_cache_dir'].COMPILE_CACHE_DIR.'/'; //缓存目录
}

是通过 defined('TEMDIR') 定义判断,已定义值有定义的值,否则取后台模板风格

查看首页文件 index.php
lmxcms1.41\index.php

define('LMXCMS',TRUE);
define('RUN_TYPE','index');
define('TEMDIR','default'); //电脑模板目录
define('COMPILE_DIR','index'); //电脑编译目录
define('COMPILE_CACHE_DIR','index'); //电脑编译缓存目录
require dirname(__FILE__).'/inc/config.inc.php';
require dirname(__FILE__).'/inc/run.inc.php';

第9行 define('TEMDIR','default'); //电脑模板目录
定义了默认风格导致后台切换无效。

处理方法 注释第9行代码
//define('TEMDIR','default'); //电脑模板目录
问题解决