在Freescale的IMX53芯片中调试Linux的3G
本记录针对53smd版本,内核未使用Ltib编译,Ltib主要用以编译Rootfs。Kernel和Uboot 均与53smd的android系统基本一致。
硬件平台:辰汉电子mx536系列开发板。
WCDMA模块:龙尚科技U6300V模块。
软件平台:Linux (kernel-version:2.6.35)
这是我第一次做这种移植,来来回回尝尽各种办法,各种折腾,所以做次记录,以供自己以后或者他人为参考。
龙尚的该模块采用的为USB转串口设计,在kernel中需要把USB to UART选中,其次选中其中的USB GSM这个选项。即:USB support -> USB Serial Convert support -> USB driver for GSM and CDMA modems,这些选中以后,插上模块,在设备文件中应该可以出现ttyUSB0,ttyUSB1和ttyUSB2,三个设备。如若没有这三个设备,一般情况下为上电不正确或者是硬件有问题,此点另谈。
这三个设备号分别对应于该模块不同的功能口。ttyUSB0龙尚科技未作介绍,看样子是预留口。ttyUSB1是标准的AT口,ttyUSB2为modem口。
PS:我的板子上因需较多的串口,故增加有一个USB转UART的芯片,该芯片占用了ttyUSB0-ttyUSB3四个设备号,该CDMA模块加载后,其三个设备口变为ttyUSB4,ttyUSB5和ttyUSB6,其ttyUSB4即对应于ttyUSB0,ttyUSB5对应ttyUSB1,ttyUSB6对应ttyUSB2。
现在,我们进入正文,以上均为基础部分。
我将分三个部分来讲,第一部分的ppp为移植的,这里已经应该是移植成功的,但是我并没有成功运行,算是未经测试的,其中的原委在下文中会细细说明。第二部分的ppp
为非移植的,是我成功的测试通过中主要使用到的ppp增加方式。第三部分则是前两部分均成功之后,都需要注意的地方。前两部分既是独立的,同时也是相互交叉,相互影响的,所以需要结合看。
第一部分:移植ppp
我下载了一个ppp的tar包,为:ppp-2.4.5.tar.gz,解压,这些都不废话。进入解压得到的ppp目录,执行configure,得到Makefile文件。2.4.5版本下的Makefile分了很多种,我们只用到Makefile.linux。
首先,需要改动你的CC
# CC = gcc
CC=/opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-non e-linux-gnueabi-gcc
这个改动要针对你自己的编译器,这个改动必须在所有的需要改动的Makefile文件中均要改动,编译器正确了,编译出来的东西才能在未来的平台上顺利运行。
其次,这里因为开发板上的库可能不全,只能选择编译静态的ppp。进入pppd目录,修改Makefile.linux文件,改动如下:
209 pppd: $(PPPDOBJS)
210 $(CC) $(CFLAGS) $(LDFLAGS) -static -o pppd $(PPPDOBJS) $(LIBS)
211
212 srp-entry: srp-entry.c
213 $(CC) $(CFLAGS) $(LDFLAGS) -static -o $@ srp-entry.c $(LIBS)
红色部分为添加部分。这样就能却保编译出pppd为静态的。
返回上一层,进入chat目录,改动如下:
22 chat: chat.o
23 $(CC) -o chat chat.o -static
24
25 chat.o: chat.c
26 $(CC) -c $(CFLAGS) -o chat.o chat.c -static
其他的几个不再赘述。
然后编译,如编译pppd,则进入pppd目录,执行以下命令:
1·make clean
2·make –f Makefile.linux
即可得到对应的静态可执行文件。不确定条件下,你可以先去掉-static,编译一次,看下目标文件的大小,再加上-static,看下大小。如pppd,没有-static时,编译出的大小约为63K,加上后为128K左右。chat非静态时大小为23k,静态时为67k左右。
+++++++++++++++++++++++++华丽丽的分割线++++++++++++++++++++++++++++
分割线之间为未经验证部分:
Pppd如果要work起来,貌似需要以下几个东西:
pppd pppdump pppstats
+++++++++++++++++++++++++华丽丽的分割线++++++++++++++++++++++++++++
此时静态的pppd基本就可以下载到板子上执行了。Fsl的Linux有点奇怪,我搜集到资料均显示,执行了pppd之后,如果你的硬件正确,那么应该会出现乱码,但是很可悲,我的一旦执行pppd就挂机了,ctrl+c也没办法停止。只能硬重启整个系统。
按照龙尚给出的资料,我在系统中创建了脚本,这些脚本将在第三部分阐述。执行了pppd call gprs,然后系统打印出几句之后,就挂掉了。
首先是一个Warning: couldn't open ppp database /var/run/pppd2.tdb
然后是什么什么的error错误,接着一行长长的,最后是status = 0x7f的一个类似错误,接着一个脚本连接错误。时间太久已经记不得了,也懒的复制错误了。
总之,到这里,我是真心不知道怎么弄了。因为不确定这些错误是因pppd移植缺失东西导致还是我的什么地方错误导致,故而决定做非移植的ppp。
第二部分:非移植ppp
搭建了ltib之后,执行ltib,进入配置,在包选择中选定ppp,编译,打包,烧录,不赘述。
然后重复写脚本,进入运行,失败。也不赘述,没任何技术难度的。提一下错误,这个错误和移植ppp相比,烧了第三行,就没有了那个status这行,其他没啥改进。
为什么这里一定要写这个非移植的ppp,目的是这样子的,因为这个非移植的ppp,我们可以确定这个ppp的环境是正确的。所以可见错误还是存在的,故而,移植的那个ppp 也应该是没有太多问题的。然后我们进入第三部分。
第三部分:bug调试
Ppp完成后,必须要内核加以支持,这里主要选择了Network device support中的PPP(point-to-point) support中的所有以及Wan interfaces support中的Generic HDLC layer,选中Generic HDLC layer后,里面的Synchronous Point-to-Point (ppp)support也需要选中。
首先,解决那个warning的问题,我找到的资料均说这个warning是因为没有在/var下建立run目录,故而导致的。或者就是文件系统的读写权限不对,为只读。但是我看了我的,首先run目录,我删掉,自己mkdir一个,还是有warning。我就是删掉,不mkdir,执行pppd call gprs,他自己依然能够添加上,里面的pppd2.tdb的这个数据库文件也会自己产生,可见我的文件系统读写权限也是对的,那是什么地方错了?遍寻各地,最后在imx论坛找到了问题的解决办法。给出的解释是:在文件系统中为/var和/tmp目录划分的大小为512K,这个为默认的,如果你没有动过,那么就是这么大了。可能是因为为/var目录划分的太少了,导致无法建立数据库出现问题,从而出现该warning。原文如下:
?Make sure there is enough space for /var:
?./ltib -c
?Target image generation
?tmpfs size: as much as required (start with 4096k, keeping in mind that it is mounted in RAM by default)
By default, the size of the tmpfs fileystem where /tmp and /var are mounted is only 512k and it fills up pretty quickly
于是,我重新制作了文件系统,找到这个地方,改为4096k,然后编译,烧写,果然,问题解决。
其次,脚本书写问题。这里主要用到了两个脚本:gprs和gprs-connect-chat两个脚本。
两个脚本的对应解释我找了一个,配合着我的加以注释,写在下面。
Gprs脚本:
#/etc/ppp/peers/gprs
# Usage: root>pppd call gprs
/dev/ttyUSB6 #改成自己的modem口
115200 #改成自己串口波特率
nocrtscts
#可能你的串口是需要crtscts,硬件流控的,这是由你的串口决定的,一般嵌入式系统
的串口没有带硬件流控,也不需要就加nocrtscts
modem #这个参数使得pppd进程将等待模块发回的CD (Carrier Detect)信号,与local
正好好相反
#noauth
debug #把调试信息输出到/var/log/messages,在调试成功后去掉它,以减少垃圾的产
生。
nodetach
#hide-password
usepeerdns #以下的3个参数一般不可少
noipdefault
defaultroute
user smsong #设置接入的用户名,在chap-secrets或者pap-secets中使用
0.0.0.0:0.0.0.0 #本地和远端的ip都设为0使得接入的isp分配本地的ip地址
ipcp-accept-local #要求peer也就是isp给自己非配动态的IP地址
#ipcp-accept-remote
#lcp-echo-failure 12
#lcp-echo-interval 3
noccp #不需要压缩控制协议,有可能对端不需要,根据自己的isp的情况
#novj
#novjccomp
persist #保证在连接断开的情况下不退出,并尝试重新打开连接
connect '/usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat'
#pppd调用chat会话进程接入对端isp,启动对端的pppd,然后本地pppd与对端的pppd 一起进行协
#商网络参数和chap/pap认证,成功后,再进行ncp层的ip的分配。
以上为这个脚本的一个说明,特感谢晚上提供这个介绍的朋友,这个很有用。以下是我的脚本,供参考
/dev/ttyUSB6
115200
nocrtscts
modem
#noauth
debug
#nodetach
#hide-password
usepeerdns
noipdefault
defaultroute
user "3gnet"
0.0.0.0:0.0.0.0
ipcp-accept-local
ipcp-accept-remote
#lcp-echo-failure 12
#lcp-echo-interval 3
#noccp
#novj
#novjccomp
#persist
connect '/usr/sbin/chat -s -v -f /etc/ppp/chat/gprs-connect-chat'
Gprs-connect-chat脚本:
#/etc/ppp/gprs-connect-chat
TIMEOUT 15
ABORT '\nBUSY\r'
ABORT '\nNO ANSWER\r'
ABORT '\nRINGING\r\n\r\nRINGING\r'
#'' AT
#'OK-+++\c-OK' ATH0
TIMEOUT 40
'' \rAT
OK ATS0=0 #这些都是标准的at命令,建议查看随模块的at命令手册
OK ATE0V1
OK AT+CGDCONT=1,"IP","CMNET" #设置isp接入网关为中国移动的cmnet,如果你想获得更多访问资源的话
OK ATDT*99***1# #中国移动gprs的接入号吗
CONNECT ''
这个脚本要根据供应商提供的脚本进行书写,以下是我的脚本,供参考:TIMEOUT 15
ABORT "DELAYED"
ABORT "BUSY"
ABORT "ERROR"
ABORT "NO DIALTONE"
ABORT "NO CARRIER"
TIMEOUT 40
'' \rAT
OK ATS0=0
OK ATE0V1
OK AT+CGDCONT=1,"IP","3GNET"
OK ATDT*99***1#
CONNECT ''
这两个脚本看似没有多大难度,实则也有可能危机重重。我就犯了一下错误。
首先,我的脚本实在Windows中书写的,下载到Linux中,在脚本的每一行最后都会因为两者不同的编码出现一个“■M”,这个可能不碍事,也可能碍事,所以还是在linux中vi一下,去掉为好。
其次,modem口的问题,我刚开始就一直写错了。
最后,在gprs-connect-chat脚本中,有这个东西,千万不能写错:
'' \rAT
这一行,以及最后一行。这里的这个“'' ”东西,看上去没啥特别,实际上,在英文条件下,两个单引号和一个双引号是基本一样的。这里是两个单引号,而不是一个双引号。切记。
这些都完成之后,你的3G就可以跑起来了。
剩下的,你就可以看看这个链接了,这里讲的很清楚的。
https://www.sodocs.net/doc/ab3754878.html,/techdoc/system/2009/07/17/1124824.shtml
chad 2012-10-19
Linux 内核修改与编译图文教程 1
1、实验目的 针对Ubuntu10.04中,通过下载新的内核版本,并且修改新版本内核中的系统调用看,然后,在其系统中编译,加载新内核。 2、任务概述 2.1 下载新内核 https://www.sodocs.net/doc/ab3754878.html,/ 2.2 修改新内核系统调用 添加新的系统调用函数,用来判断输入数据的奇偶性。 2.3 进行新内核编译 通过修改新版内核后,进行加载编译。最后通过编写测试程序进行测试 3、实验步骤 3.1 准备工作 查看系统先前内核版本: (终端下)使用命令:uname -r 2
3.2 下载最新内核 我这里使用的内核版本是 3.3 解压新版内核 将新版内核复制到“/usr/src”目录下 在终端下用命令:cd /usr/src进入到该文件目录 解压内核:linux-2.6.36.tar.bz2,在终端进入cd /usr/src目录输入一下命令: bzip2 -d linux-2.6.36.tar.bz2 tar -xvf linux-2.6.36.tar 文件将解压到/usr/src/linux目录中 3
使用命令: ln -s linux-2.6.36 linux 在终端下输入一下命令: sudo apt-get install build-essential kernel-package libncurses5-dev fakeroot sudo aptitude install libqt3-headers libqt3-mt-dev libqt3-compat-headers libqt3-mt 4
Pintos调试心得 一、如何用GDB调试内核: Ctrl+Alt+F1打开终端,cd切换到你的pintos/src/threads/build目录下 输入命令pintos –gdb –run alarm-multiple(注意是双线- -,注意run前的空格)出现下面的界面:(注意uilts文件下已经编译通过,还有bochs打开终端调试) 然后,Ctrl+Alt+F2打开第二个终端登录并切换到pintos/src/threads/build目录下 输入命令pintos-gdb -tui 看到如下界面:
按enter键继续,此时为进入gdb调试控制台 输入命令target remote localhost:1234(默认端口,应该与第一个终端里显示的一致)接着输入命令file kernel.o(载入要调试的内核程序),看到如下界面: 输入y继续,这样开始调试啦 (首先自己在网上百度一下gdb常用的调试命令) break main(在main函数入口插入断点) 接着c(continue的意思跟VS、VC++中的调试命令对应) 看到如下界面
注意划红线部分 输入n(执行下一步,不会进入函数体内部,step单步运行命令会进入函数内部)然后大家可以在第一个终端里查看运行结果。比如我在第79行添加了一行 Ctrl+Alt+F1打开第一个终端可以看到执行结果 接下来自己慢慢探索吧,感受一下gdb调试器的强大之处。 下面介绍一下我对pintos的理解 二、Pintos内部函数调用 内核加载完成后,进入main函数(pintos主程序) 开始boot bss_init (); 初始化BSS,(BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是:可读写的,在程序执行之前BSS 段会自动清0。) argv = read_command_line ();//读取命令行 argv = parse_options (argv);//分析命令行
如何自行编译一个Linux内核的详细资料概述 曾经有一段时间,升级Linux 内核让很多用户打心里有所畏惧。在那个时候,升级内核包含了很多步骤,也需要很多时间。现在,内核的安装可以轻易地通过像 apt 这样的包管理器来处理。通过添加特定的仓库,你能很轻易地安装实验版本的或者指定版本的内核(比如针对音频产品的实时内核)。 考虑一下,既然升级内核如此容易,为什么你不愿意自行编译一个呢?这里列举一些可能的原因: 你想要简单了解编译内核的过程 你需要启用或者禁用内核中特定的选项,因为它们没有出现在标准选项里 你想要启用标准内核中可能没有添加的硬件支持 你使用的发行版需要你编译内核 你是一个学生,而编译内核是你的任务 不管出于什么原因,懂得如何编译内核是非常有用的,而且可以被视作一个通行权。当我第一次编译一个新的Linux 内核(那是很久以前了),然后尝试从它启动,我从中(系统马上就崩溃了,然后不断地尝试和失败)感受到一种特定的兴奋。 既然这样,让我们来实验一下编译内核的过程。我将使用Ubuntu 16.04 Server 来进行演示。在运行了一次常规的 sudo apt upgrade 之后,当前安装的内核版本是 4.4.0-121。我想要升级内核版本到 4.17,让我们小心地开始吧。 有一个警告:强烈建议你在虚拟机里实验这个过程。基于虚拟机,你总能创建一个快照,然后轻松地从任何问题中回退出来。不要在产品机器上使用这种方式升级内核,除非你知道你在做什么。 下载内核 我们要做的第一件事是下载内核源码。在 Kernel 找到你要下载的所需内核的URL。找到URL 之后,使用如下命令(我以 4.17 RC2 内核为例)来下载源码文件: wget https://git.kernel/torvalds/t/linux-4.17-rc2.tar.gz
2.4 实例—使用gdb调试器 1.编写实例程序gcctest.c,见2.2小节的开头部分 2.编译 3.启动GDB,执行程序 启动gdb,进入gdb调试环境,可以使用gdb的命令对程序进行调试。 [root@localhost gdbtest txt]# gdb //启动gdb GNU gdb Fedora (6.8-27.el5) Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later
展讯工具使用 1.校准工具CFT A B C D E A : 选择测试机种 B : 将所有的勾打上,记录测试数据 C : Log处可随意选择本机目录,用于存储测试的纪录。FDL处必须选择展讯正式发布给工厂的软件包中的Fdl_amd.bin文件,对于6600M平台来说,FDL不需要,NV处必须选择展讯正式发布给工厂软件包中NV_Parameters目录下的NVitem_release.prj文件; D : 校准用的项目 F : 相关的FT测试数据,在校准时将所有勾去除 2.DOWNLOAD 程序
根据不同的项目导入FDL , BOOTLOADER ,PS ,MMIRES,NV BOOTLOADER , PS ,MMI, 在DOWNLOAD 时候可以不选,FDL必须选上 地址选项PRODUCT为NAND,相关的地址与底层有关
NAND FLASH选项为SMALL PAGE REPARTITION SETTING 默认为2 。 校准数据保留,将backup calibration 打上将保留全部nv数据3.Mobile test 使用说明
Calibration 说明: 1) 做Calibration 之前,首先要确保手机进入“Calibration mode ”,如果不是,要点击 按钮①进入校准模式(目前不支持)。 2) 接着点击按钮④,连通DSP 与RF 之间的通路。 3) 下一步选择手机的工作频段,共有五种:EGSM900,DCS1800, EGSM-DCS-DUALBAND ,PCS1900,GSM850(在不同的频段arfcn,txpwr lv 有不同的数值),选择好之后点击按钮⑥即可设置好工作频段。进行了2、3步的操作后就可以进行发射或接收的操作了。 4) 点击按钮③可以开发射,它有两个参数:afc,dac 。在DCXO 下有afc,dac 两个参数, 在TCXO 下有dac 一个参数(DCXO ,TCXO 通过⑧来选择)。执行该步操作可以实现AFC 的操作。 5) 按钮②可设置发射时的factor 值。再点击按钮4就可以实现APC 的操作。 6) 按钮⑦可做接收,在这之前要先设置好RX 的各值:type,gain ind,gain val,rach ab. 在Result ⑨处显示RSSI 的值。执行该步操作可以实现AGC 的操作。 7) 选中Multi Ramp(⑤处) ,即可设置所需PA parameter 和Ramp Up Num 两个参数。 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨
实验二 嵌入式Linux系统内核的配置、编译和烧写 1.实验目的 1)掌握交叉编译的基本概念; 2)掌握配置和编译嵌入式Linux操作系统内核的方法; 3)掌握嵌入式系统的基本架构。 2.实验环境 1)装有Windows系统的计算机; 2)计算机上装有Linux虚拟机软件; 3)嵌入式系统实验箱及相关软硬件(各种线缆、交叉编译工具链等等)。 3.预备知识 1)嵌入式Linux内核的配置和裁剪方法; 2)交叉编译的基本概念及编译嵌入式Linux内核的方法; 3)嵌入式系统的基本架构。 4.实验内容和步骤 4.1 内核的配置和编译——配置内核的MMC支持 1)由于建立交叉编译器的过程很复杂,且涉及汇编等复杂的指令,在这里 我们提供一个制作好的编译器。建立好交叉编译器之后,我们需要完成 内核的编译,首先我们要有一个完整的Linux内核源文件包,目前流行 的源代码版本有Linux 2.4和Linux 2.6内核,我们使用的是Linux 2.6内核; 2)实验步骤: [1]以root用户登录Linux虚拟机,建立一个自己的工作路径(如用命令 “mkdir ‐p /home/user/build”建立工作路径,以下均采用工作路径 /home/user/build),然后将“cross‐3.3.2.tar.bz2、dma‐linux‐2.6.9.tar.gz、 dma‐rootfs.tar.gz”拷贝到工作路径中(利用Windows与虚拟机Linux 之间的共享目录作为中转),并进入工作目录; [2]解压cross‐3.3.2.tar.bz2到当前路径:“tar ‐jxvf cross‐3.3.2.tar.bz2”; [3]解压完成后,把刚刚解压后在当前路径下生成的“3.3.2”文件夹移 动到“/usr/local/arm/”路径下,如果在“/usr/local/”目录下没有“arm” 文件夹,用户创建即可; [4]解压“dma‐linux‐2.6.9.tar.gz”到当前路径下:
dsp调试can一点心得 调试的过程也就是学习的过程,无前人领路,只有自己摸索, 不免要耗费更多的时间和精力,从看书到调试到完全调通,用了差不多一星期的时间,当然不是全满,嘿嘿,偶尔还是要玩玩,在这里总结一下,脑子不好用,日后必定就忘记了这宝贵的经历。 1:如何配置can的问题 首先要按照书上所讲的做基本配置,(ECanaShadow == ECanaRegs) GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6 = 1; //定义为can功能 GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7 = 1; //定义为can功能ECanaShadow.CANTIOC.bit.TXFUNC = 1; //定义为can发送功能 ECanaShadow.CANRIOC.bit.RXFUNC = 1; //定义为can接收功能 然后再不使能邮箱的情况下作如下设置:ECanaRegs.CANME.all = 0; //不使能邮箱ECanaRegs.CANMD.all = 0xFFFF0000; /*0~15 is TX,16~31 is RX*/ 设置邮箱ID号: /*发送邮箱的ID号*/ ECanaMboxes.MBOX0.MID.all = 0xa0000000; //mid.aam=1 自动应答模式ECanaMboxes.MBOX1.MID.all = 0x9555AAA1; ECanaMboxes.MBOX2.MID.all = 0x9555AAA2; ECanaMboxes.MBOX3.MID.all = 0x9555AAA3; ECanaMboxes.MBOX4.MID.all = 0x9555AAA4; ECanaMboxes.MBOX5.MID.all = 0x9555AAA5; ECanaMboxes.MBOX6.MID.all = 0x9555AAA6; ECanaMboxes.MBOX7.MID.all = 0x9555AAA7; ECanaMboxes.MBOX8.MID.all = 0x9555AAA8; ECanaMboxes.MBOX9.MID.all = 0x9555AAA9; ECanaMboxes.MBOX10.MID.all = 0x9555AAAA; ECanaMboxes.MBOX11.MID.all = 0x9555AAAB; ECanaMboxes.MBOX12.MID.all = 0x9555AAAC; ECanaMboxes.MBOX13.MID.all = 0x9555AAAD; ECanaMboxes.MBOX14.MID.all = 0x9555AAAE; ECanaMboxes.MBOX15.MID.all = 0x9555AAAF; /*接收邮箱的ID号*/ ECanaMboxes.MBOX16.MID.all = 0x80000000; ECanaMboxes.MBOX17.MID.all = 0x9555AAA1; ECanaMboxes.MBOX18.MID.all = 0x9555AAA1; ECanaMboxes.MBOX19.MID.all = 0x9555AAA1; ECanaMboxes.MBOX20.MID.all = 0x9555AAA1; ECanaMboxes.MBOX21.MID.all = 0x9555AAA1; ECanaMboxes.MBOX22.MID.all = 0x9555AAA1; ECanaMboxes.MBOX23.MID.all = 0x9555AAA1; ECanaMboxes.MBOX24.MID.all = 0x9555AAA1; ECanaMboxes.MBOX25.MID.all = 0x9555AAA1;
嵌入式Linux视频教程 相关搜索:简体中文, 学习方法, 视频教程, 普通话, 嵌入式 中文名: 嵌入式Linux视频教程 资源格式: 光盘镜像 学校: 成都国嵌嵌入式培训中心版本: 成都国嵌嵌入式培训中心的基于广州友善之发行日期: 2010年 地区: 大陆 对白语言: 普通话 文字语言: 简体中文 视频光盘目录结构 国嵌视频1.iso -学习方法与课程体系介绍(学前必看) -学习方法介绍.avi -国嵌嵌入式课程体系.pdf -嵌入式Linux学习方法.pdf -国嵌课程1-嵌入式入门体验班(上) -第1天(嵌入式系统概述) -国嵌体验入门班-1-1(嵌入式系统概述).avi -国嵌体验入门班-1-2(ARM概述).avi -国嵌体验入门班-1-3(嵌入式Linux概述).avi -国嵌体验入门班-1-4(2440开发板介绍).avi -国嵌体验入门班-1-5(软硬件环境搭建).avi -第2天(开发板快乐体验) -国嵌体验入门班-2-1(开发板系统安装).avi -国嵌体验入门班-2-1(开发板系统安装-Jlink方式).avi -国嵌体验入门班-2-1(开发板系统安装-并口方式).avi -国嵌体验入门班-2-2(裸机程序体验).avi -国嵌体验入门班-2-3(QT系统体验).avi -国嵌体验入门班-2-4(Android系统体验).avi 国嵌视频2.iso
-国嵌课程1-嵌入式入门体验班(下) -第3天(Linux系统体验) -国嵌体验入门班-3-1(Linux定制安装).avi -国嵌体验入门班-3-2(Linux命令).avi -国嵌体验入门班-3-3(VI使用).avi -国嵌体验入门班-3-4(Linux系统管理).avi -国嵌体验入门班-3-5(Shell编程).avi -国嵌体验入门班-3-6(Qcd功能演示).avi -国嵌体验入门班-3-7(必修实验).avi -国嵌课程2-嵌入式Linux应用开发班 -第1天(编程基础) -国嵌应用班-1-1(GCC程序编译).avi -国嵌应用班-1-2(GDB程序调试).avi -国嵌应用班-1-3(makefile工程管理).avi -国嵌应用班-1-4(必修实验).avi -第2天(文件时间编程) -国嵌应用班-2-1(系统调用方式访问文件).avi -国嵌应用班-2-2(库函数访问文件).avi -国嵌应用班-2-3(时间编程).avi -国嵌应用班-2-4(必修实验).avi -第3天(多进程程序设计) -国嵌应用班-3-1(进程控制原理).avi -国嵌应用班-3-2(进程控制程序设计).avi -国嵌应用班-3-3(必修实验).avi -第4天(进程间通讯) -国嵌应用班-4-1(进程间通讯概述).avi -国嵌应用班-4-2(管道通讯).avi -国嵌应用班-4-3(信号通讯).avi -国嵌应用班-4-4(共享内存通讯).avi -国嵌应用班-4-5(必修实验).avi -第5天(进程间通讯) -国嵌应用班-5-1(消息队列).avi
linux、内核源码、内核编译与配置、内核模块开发、内核启动流程(转) linux是如何组成的? 答:linux是由用户空间和内核空间组成的 为什么要划分用户空间和内核空间? 答:有关CPU体系结构,各处理器可以有多种模式,而LInux这样的划分是考虑到系统的 安全性,比如X86可以有4种模式RING0~RING3 RING0特权模式给LINUX内核空间RING3给用户空间 linux内核是如何组成的? 答:linux内核由SCI(System Call Interface)系统调用接口、PM(Process Management)进程管理、MM(Memory Management)内存管理、Arch、 VFS(Virtual File Systerm)虚拟文件系统、NS(Network Stack)网络协议栈、DD(Device Drivers)设备驱动 linux 内核源代码 linux内核源代码是如何组成或目录结构? 答:arc目录存放一些与CPU体系结构相关的代码其中第个CPU子目录以分解boot,mm,kerner等子目录 block目录部分块设备驱动代码 crypto目录加密、压缩、CRC校验算法 documentation 内核文档 drivers 设备驱动 fs 存放各种文件系统的实现代码 include 内核所需要的头文件。与平台无关的头文件入在include/linux子目录下,与平台相关的头文件则放在相应的子目录中 init 内核初始化代码 ipc 进程间通信的实现代码 kernel Linux大多数关键的核心功能者是在这个目录实现(程序调度,进程控制,模块化) lib 库文件代码 mm 与平台无关的内存管理,与平台相关的放在相应的arch/CPU目录net 各种网络协议的实现代码,注意而不是驱动 samples 内核编程的范例 scripts 配置内核的脚本 security SElinux的模块 sound 音频设备的驱动程序 usr cpip命令实现程序 virt 内核虚拟机 内核配置与编译 一、清除 make clean 删除编译文件但保留配置文件
一、设置断点(BreakPoint ) 我们用break 命令来设置断点。正面有几点设置断点的方法: break
操作系统实验报告 姓名:学号: 一、实验题目 1.编译linux内核 2.使用autoconf和automake工具为project工程自动生成Makefile,并测试 3.在内核中添加一个模块 二、实验目的 1.了解一些命令提示符,也里了解一些linux系统的操作。 2.练习使用autoconf和automake工具自动生成Makefile,使同学们了解Makefile的生成原理,熟悉linux编程开发环境 三、实验要求 1使用静态库编译链接swap.c,同时使用动态库编译链接myadd.c。可运行程序生成在src/main目录下。 2要求独立完成,按时提交 四、设计思路和流程图(如:包括主要数据结构及其说明、测试数据的设计及测试结果分析) 1.Makefile的流程图: 2.内核的编译基本操作 1.在ubuntu环境下获取内核源码 2.解压内核源码用命令符:tar xvf linux- 3.18.12.tar.xz 3.配置内核特性:make allnoconfig 4.编译内核:make 5.安装内核:make install
6.测试:cat/boot/grub/grub.conf 7.重启系统:sudo reboot,看是否成功的安装上了内核 8.详情及结构见附录 3.生成makefile文件: 1.用老师给的projec里的main.c函数。 2.需要使用automake和autoconf两个工具,所以用命令符:sudo apt-get install autoconf 进行安装。 3.进入主函数所在目录执行命令:autoscan,这时会在目录下生成两个文件 autoscan.log和configure.scan,将configure.Scan改名为configure.ac,同时用gedit打开,打开后文件修改后的如下: # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_CONFIG_SRCDIR([main.c]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE(main,1.0) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT(Makefile) 4.新建Makefile文件,如下: AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=main first_SOURCES=main.c 5.运行命令aclocal 命令成功之后,在目录下会产生aclocal.m4和autom4te.cache两个文件。 6.运行命令autoheader 命令成功之后,会在目录下产生config.h.in这个新文件。 7.运行命令autoconf 命令成功之后,会在目录下产生configure这个新文件。 8.运行命令automake --add-missing输出结果为: Configure.ac:11:installing./compile’ Configure.ac:8:installing ‘.install-sh’ Configure.ac:8:installing ‘./missing’ Makefile.am:installing ‘./decomp’ 9. 命令成功之后,会在目录下产生depcomp,install-sh和missing这三个新文件和执行下一步的Makefile.in文件。 10.运行命令./configure就可以自动生成Makefile。 4.添加内核模块
用GDB调试程序 GDB概述 ———— GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UN IX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 一般来说,GDB主要帮忙你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、动态的改变你程序的执行环境。 从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。 一个调试示例 —————— 源程序:tst.c
1 #include
GDB调试精粹及使用实例 一:列文件清单 1. List (gdb) list line1,line2 二:执行程序 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、?、[、])在内。 如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。 利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。 (gdb)set args –b –x (gdb) show args backtrace命令为堆栈提供向后跟踪功能。 Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。 三:显示数据 利用print 命令可以检查各个变量的值。 (gdb) print p (p为变量名) whatis 命令可以显示某个变量的类型 (gdb) whatis p type = int * print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容: l 对程序中函数的调用 (gdb) print find_entry(1,0) l 数据结构和其他复杂对象 (gdb) print *table_start $8={e=reference=’\000’,location=0x0,next=0x0} l 值的历史成分 (gdb)print $1 ($1为历史记录变量,在以后可以直接引用 $1 的值) l 人为数组 人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示: base@length 因此,要想显示在h后面的10个元素,可以使用h@10: (gdb)print h@10 $13=(-1,345,23,-234,0,0,0,98,345,10)
50000吨半潜船设备调试的工作方法 摘要本文主要阐述了黄船公司建造的50000吨半潜船的发电机的调试,和上建的内通系统,二氧化碳,机舱水雾等系统的调试工作及其中出现的问题和改进方案。 关键词50000吨发电机配电板航行信号灯二氧化碳内通系统 1前言当代国内外的船舶业都在迅猛发展中。设备调试,作为船舶建造中最后一关,也是最重要的一个环节,怎样利用合理的工作方法,在质量第一的基础上提高各系统调试的效率就显得尤为重要。50000吨是亚洲最大,世界先进的半潜船。在该船的现场调试过程中,我总结了一些系统调试的工作方法,包括:电站系统、广播、声力电话、自动电话、子母钟、航行信号灯、二氧化碳系统、火灾报警系统、以及负责了机舱水雾等系统。 2各系统调试中遇到的问题和改进方案 2.1电站系统的调试 作为一艘中压电力推进的半潜船,该船的电站系统配备了四台主柴油发电机组、一台停泊柴油发电机组、两套中压配电板及两套低压主配电板、一套应急配电板。相比之下,该船电站系统比较繁琐和复杂。 2.1.1柴油发电机组及配电板的调试工作 柴油发电机组,作为机舱的核心设备,有着监测报警点繁多,控制系统复杂,管路交错的特点。 作为船上核心设备,如何把柴油机上这几百个监测点理清楚,如何知道这条管是做什么用的,试验过程中先做什么,再做什么,对于提高调试效率是至关重要的。所以,电站及动力系统的试验,对于调试人员的要求是比较高的。 所以,在试验开始之前,要深入机舱,熟悉各个传感器的位置及功能,要先将各个测点号标明位置,至少做到心中有数。这样,在试验过程中,包括对外报验的过程中,才能事半功倍。 2.1.2配电板的调试工作 配电板的调试前,一定要先熟悉随机资料及内部原理,这样,在试验中,才不会盲目而无从下手。熟悉了随机资料,查线对线工作才能得心应手。 在调试过程中,要特别注意各个开关信号之间的联锁。尤其这艘50000吨半潜船配备了两块中压配电板,两块低压主配电板和一块应急配电板,各个开关的联锁信号更多繁杂而且繁多。因为联锁是为了考虑设备的安全而设计的功能,所以,这方面的调试,要格外细心。 其次,是柴油发电机组的并联运行试验。根据常规的试验方法,是先做柴油发电机组的单机特性试验,再做并联运行试验。但实际的调试中,当功能试验都已经完成之后,可以先试着并联运行,可以大概看出哪台机组的特性和其它几台存在差异,之后的调试,就会更有针对性,这样,可以少走些弯路,提高电站的调试效率。 最后,是自动电站的调试工作,自动电站的调试,一定要在整个手动和半自动电站的试验都完善的情况下来做。50000吨的自动电站和其它船相比,不同的是,它的PMS程序是监测系统来完成的,如果手动和半自动功能未试完,直接试自动功能的话,中间可能会遇到很多问题。 2.2广播系统的调试工作 由于该系统分布的比较散,在调试的过程中,首先我们要把广播机柜和所有的喇叭对完线,遇到有问题的逐个逐个的排除,直至所有的喇叭对完线,检查好以后把电源送上。因广
机器调试实践实习心得 调试机器是机器制造的最后一步,同时也是最难最费时的一步,决定成败的一步。听老师傅们说,有时候一台机条一个一个月都不一定可以弄好。调试时一门技术活,需要经验的积累,一般都是老师傅们带着我们来条,不同的机器调试方法也不同,没什么固定套路。我很有幸在实习过程中参与过一次调机,下面我就我调试的热胶机进行一次详细讲解。 热胶机在众多机器中不算很复杂,但是调试是这台机器的难点,调试的重点是让机器不要漏胶。首先,在调试之前我们要确定装配的正确性,进行一次整体检查。然后我们需要在调试前做一些资料调查和采集: 1、通过看图纸了解设计者的意图,找到设计师留给我们的调节机 构并搞清楚它的调节方法以及规律; 2、找出一些我们可以利用的机构进行微调已达到我们所希望的目 的,这并非设计者有意留下的,而是靠经验自己去发现的; 3、了解我们所用胶的物理属性、化学属性以及工作温度; 4、找齐我们调试时所需要的工具; 5、最后一点也是最重要的一点,考虑一下可能出现的突发状况并 做好相应的措施,安全第一。热胶机由于温度过高,所以注意 被烫到,带上手套。 调试过程中我们先找出所有可能变量,然后通过控制变量法进行验证找出实际变量并通过调试找出各个变量的变化规律,然后进行思考找
出变动最小、可靠性、安全性最好的调节方式,固定一些变量,最后调节使机器达到要求。调试成功后,需要将机器持续工作一段时间看其稳定性,最后将机器整理干净,打包出售。 虽然这次调试是在师傅们的带领下进行的,但是我还是学到好多东西,知道了自己是多么的不足,知道了自己不可急功近利,在机械这行就要沉得住气,一步一个脚印才能有所作为。非常感谢谢带着我们的师傅们的关照和谆谆教诲! 杨春雨 2014.1.12
GDB调试及实例 一:列文件清单 1.List (gdb) list line1,line2 二:执行程序 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、?、[、])在内。 如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。 利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。 (gdb)set args –b –x (gdb) show args backtrace命令为堆栈提供向后跟踪功能。 Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。 三:显示数据 利用print 命令可以检查各个变量的值。 (gdb) print p (p为变量名) whatis 命令可以显示某个变量的类型 (gdb) whatis p type = int * print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容: l 对程序中函数的调用 (gdb) print find_entry(1,0) l 数据结构和其他复杂对象 (gdb) print *table_start $8={e=reference=’\000’,location=0x0,next=0x0} l 值的历史成分 (gdb)print $1 ($1为历史记录变量,在以后可以直接引用$1 的值) l 人为数组 人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示: base@length 因此,要想显示在h后面的10个元素,可以使用h@10: (gdb)print h@10 $13=(-1,345,23,-234,0,0,0,98,345,10)
[原创]linux2.6内核的编译步骤及模块的动态加载-内核源码 学习-linux论坛 05年本科毕业设计做的是Linux下驱动的剖析,当时就买了一本《Linux设备驱动程序(第二版)》,但是没有实现将最简单的helloworld程 序编译成模块,加载到kernel里。不过,现在自己确实打算做一款芯片的Linux的驱动,因此,又开始看了《Linux设备驱动程序》这本书,不过已 经是第三版了。第二版讲的是2.4的内核,第三版讲的是2.6的内核。两个内核版本之间关于编译内核以及加载模块的方法都有所变化。本文是基于2.6的内核,也建议各位可以先看一下《Linux内核设计与实现(第二版)》作为一个基础知识的铺垫。当然,从实践角度来看,只要按着以下的步骤去做也应该可以实现成功编译内核及加载模块。个人用的Linux版本为:Debian GNU/Linux,内核版本为:2.6.20-1-686.第一步,下载Linux内核的源代码,即构建LDD3(Linux Device Drivers 3rd)上面所说的内核树。 如过安装的Linux系统中已经自带了源代码的话,应该在/usr/src目录下。如果该目录为空的话,则需要自己手动下载源代码。下载代码的方法和链接很多,也可以在CU上通过
https://www.sodocs.net/doc/ab3754878.html,/search/?key=&;q=kernel&a mp;frmid=53去下载。不过,下载的内核版本最好和所运行的Linux系统的内核版本一致。当然,也可以比Linux系统内核的版本低,但高的话应该不行(个人尚未实践)。 Debian下可以很方便的通过Debian源下载: 首先查找一下可下载的内核源代码: # apt-cache search linux-source 其中显示的有:linux-source-2.6.20,没有和我的内核版本完全匹配,不过也没关系,直接下载就可以了: # apt-get install linux-source-2.6.20 下载完成后,安装在/usr/src下,文件名为: linux-source-2.6.20.tar.bz2,是一个压缩包,解压缩既可以得到整个内核的源代码: # tar jxvf linux-source-2.6.20.tar.bz2
如何在Linux中使用gdb调试C程序 无论多么有经验的程序员,开发的任何软件都不可能完全没有bug。因此,排查及修复bug 成为软件开发周期中最重要的任务之一。有许多办法可以排查bug(测试、代码自审等等),但是还有一些专用软件(称为调试器)可以帮助准确定位问题的所在,以便进行修复。 如果你是C/C++ 程序员,或者使用Fortran 和Modula-2 编程语言开发软件,那么你将会很乐意知道有这么一款优秀的调试器- GDB - 可以帮你更轻松地调试代码bug 以及其它问题。在这篇文章中,我们将讨论一下GDB 调试器的基础知识,包括它提供的一些有用的功能/选项。 在我们开始之前,值得一提的是,文章中的所有说明和示例都已经在Ubuntu 14.04 LTS 中测试过。教程中的示例代码都是 C 语言写的;使用的shell 为bash(4.3.11);GDB 版本为7.7.1。 GDB 调试器基础 通俗的讲,GDB 可以让你看到程序在执行过程时的内部流程,并帮你明确问题的所在。我们将在下一节通过一个有效的示例来讨论GDB 调试器的用法,但在此之前,我们先来探讨一些之后对你有帮助的基本要点。 首先,为了能够顺利使用类似GDB 这样的调试器,你必须以指定的方式编译程序,让编译器产生调试器所需的调试信息。例如,在使用gcc 编译器(我们将在本教程之后的章节用它来编译C 程序示例)编译代码的时候,你需要使用 -g 命令行选项。 IT网,http://it 想要了解gcc 编译器手册页中关于 -g 命令行选项相关的内容,请看这里。 下一步,确保在你的系统中已经安装GDB 调试器。如果没有安装,而且你使用的是基于Debian 的系统(如Ubuntu),那么你就可以使用以下命令轻松安装该工具: sudo apt-get install gdb 在其他发行版上的安装方法,请看这里。 现在,当你按照上述的方式编译完程序(gcc -g 命令行选项),同时也已经安装好GDB 调