RTOS(程序员-开发环境).ppt

上传人:牧羊曲112 文档编号:6517996 上传时间:2023-11-08 格式:PPT 页数:45 大小:671KB
返回 下载 相关 举报
RTOS(程序员-开发环境).ppt_第1页
第1页 / 共45页
RTOS(程序员-开发环境).ppt_第2页
第2页 / 共45页
RTOS(程序员-开发环境).ppt_第3页
第3页 / 共45页
RTOS(程序员-开发环境).ppt_第4页
第4页 / 共45页
RTOS(程序员-开发环境).ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《RTOS(程序员-开发环境).ppt》由会员分享,可在线阅读,更多相关《RTOS(程序员-开发环境).ppt(45页珍藏版)》请在三一办公上搜索。

1、1,RTOS编程培训,2,课程目的,掌握RGOS线程调度的基本原理熟练应用IPC进行多线程开发掌握RGOS的中断和定时器管理机制掌握RGOS内存管理的正确使用方法学会搭建RGOS的编程环境,掌握基本的嵌入式开发和调试技能,3,考核方式,笔试(闭卷)60%上机 40%编程练习上机调试,4,课程内容,开发环境与调试方法系统调度、中断与线程间通信多线程开发常见问题、定时器与内存管理,5,学习指导,RGOS的一些基本概念注意理解和区分理解并掌握各种机制的应用场合对开发过程中的约束和注意事项要牢记接口只要在要用的时候会用即可,参考资料,Operating System Concepts Abraham

2、Silberschatz Peter Baer Galvin,Greg Gagne John Wiley&sons,Inc.操作系统概念高等教育出版社 Real-Time Concepts For Embedded Systems Qing Li,Caroline Yao CMP Books 嵌入式系统的实时概念北京航空航天大学出版社http:/http:/,7,开发环境 开发基本流程 子系统 常用调试方法,开发环境,host 主机平台X86+Windows/Linux,Target目标平台PPC/MIPS/ARM,9,交叉编译,在A平台上编译生成B平台运行的程序交叉编译器为什么要交叉编译?目

3、标平台缺乏编译环境目标平台未建立目标平台不支持直接主机编译(资源限制),10,编译链接环境,Cygwin下载地址:ftp:/user192.168.5.142/#应用软件#/编译工具类/Cygwin-20050107.rar安装方式 略交叉编译器PPC:ftp:/user192.168.5.142/#应用软件#/编译工具类其他:需要时再找安装方式:解压缩到cygwin的根目录下将交叉编译器的bin目录添加到系统环境变量“path”中,11,启动引导方式,交换机:三级引导Boot-Ctrl-Main路由器:二级引导Bootloader-Main为什么需要多级引导?Boot:功能最简单,负责初始化

4、最基本的运行环境。仅能使用串口进行对外交互。Ctrl/Bootloader:相对Boot增加了网口驱动,文件系统等功能。Main:功能最丰富,包括了各种上传应用协议等等。,12,代码结构,根目录,kernel,arch,driver,include,target,ppc,mips,pci,i2c,arch,driver,project,mpc82xx,sibyte,s57,r36,main,boot,ctrl,s57,build,conf,r36,arch,kernel,driver,target,存放配置结果,存放编译链接产生的中间文件和最终文件,源代码文件,Program,Project,

5、编译工程,13,开发环境 开发基本流程 子系统 常用调试方法,14,开发基本流程,第一步:编写源代码(略)第二步:编写源码相关的配置文件(包括makefile文件)第三步:进行工程配置第四步:编译第五步:将编译生成的程序载入到目标板上第六步:运行程序,15,基础知识:几种重要的文件类型,主config.in文件 位置:./scripts/作用:生成配置结果文件(.config)以及头文件(autoconf.h)主makefile文件 位置:根目录下 作用:根据配置结果文件确定需要编译哪些子目录,并将这些子目录的.o文件链接成最终的目标文件,16,基础知识:几种重要的文件类型,config.in

6、文件 位置:各个模块所在目录 作用:对当前模块进行配置,以支持模块的卸载和添加 makefile文件 位置:各个源文件所在目录 作用:根据配置确定该目录下的哪些源文件和子目录需要被编译以上两个文件统称为该模块的配置文件,17,基础知识:几种重要的文件类型,Rules.make 位置:根目录下 作用:确定编译的依赖规则,并根据配置文件逐层递归遍历每个目录下的各个子目录,编译生成对应的.o文件,18,如何进行配置和编译,例子:S57主程序的配置(Program:main;Project:s57)1.进入/project/main/s57/目录2.执行./makes config命令3.根据提示进行

7、配置4.执行./makes命令进行编译,19,第二步:编写配置文件,配置项的命名 必须以“CONFIG_”开头。建议是“CONFIG_模块名_变量名”的格式配置项的定义 define_bool bool define_int int define_string string define_hex hex,20,第二步:编写配置文件,配置项定义例子:hex The alloc limits of packet buffer CONFIG_PACKET_ALLOC_MAX 0 x4000define_bool CONFIG_CPM2PIC ybool Support PCI CONFIG_PCIs

8、tring Default main file name CONFIG_MAIN_FILEint How Many processors?CONFIG_NR_CPUS 2 2 4,The alloc limits of packet buffer(CONFIG_PACKET_ALLOC_MAX)4000(NEW)5000,Support PCI(CONFIG_PCI)N/y/?(NEW)Y,Default main file name(CONFIG_MAIN_FILE)(NEW),How Many processors?(CONFIG_NR_CPUS)2(NEW)5 Input errorHo

9、w Many processors?(CONFIG_NR_CPUS)2(NEW)4,21,第二步:编写配置文件,config.in文件中使用的条件判断bool Open SYSTEM Debug CONFIG_SYS_DEBUGif$CONFIG_SYS_DEBUG=y;then define_bool CONFIG_SYS_ASSERT yficonfig.in文件的包含关系bool Support redundancy?CONFIG_RDNDif$CONFIG_RDND=y;then include kernel/rdnd/config.infi,22,第二步:编写配置文件,配置项的最终保

10、存方式Program/Project/conf/.config(配置结果文件)以makefile中变量的形式保存所有的配置项 用于指导makefile中的编译和链接Program/Project/conf/autoconf.h(配置结果头文件)以C语言中宏定义的形式保存所有的配置项 按模块分解成多个.h,用于源文件中,23,第二步:编写配置文件,Makefile文件的一般格式:O_TARGET:=_sub_xxx.o#注意:xxx为当前目录名subdir-y:=d1 d2#我想编译当前目录下的哪些子目录obj-y:=y1.o y2.o#我想编译当前目录下的那些文件EXTRA_CFLAGS+=-

11、Walloverride EXTRA_INCLUDE+=-I$(TOPMK)/./include#我还想将哪些目录作为系统头文件目录(可用包含)include$(TOPDIR)/Rules.make#这个必须加,24,第二步:编写配置文件,Makefile中如何使用配置项如:/driver/makefile中的一部分O_TARGET:=_sub_driver.osubdir-y:=asyncsubdir-$(CONFIG_I2C)+=i2csubdir-$(CONFIG_MTD)+=mtdsubdir-$(CONFIG_PCI)+=pci#当.config文件中CONFIG_PCI=y时,实际

12、上就等于:#subdir-y+=pci,25,第二步:编写配置文件,Makefile中如何使用配置项Ifeq($(CONFIG_UART_LL),y)obj-y+=uart_debug.oelse obj-y+=uart.oEndif思考:能否使用obj-$(CONFIG_UART_LL)这种方式?,26,第三/四步:配置与编译,命令 配置:makes config 编译:makes进行配置操作后生成的文件 Program/Project/conf/.config(配置结果文件)Program/Project/conf/autoconf.h(配置结果头文件)进行编译操作后生成的文件 xxx.b

13、in_可执行程序 xxx.disasm.gz压缩后的反汇编文件 其他文件,27,示例:如何添加一个新的模块,1.新的模块目录就位2.编写模块内部的配置菜单config.in3.编写这个新目录内的Makefile4.添加这个新模块的加载菜单5.修改上一级目录的Makefile,28,示例:如何添加一个新的模块,例子:在driver目录下加入AAA设备的驱动模块.(假设该模块代码包括a1.c和a2.c)1.确定AAA设备驱动模块所在的位置(/driver/aaa/目录下)2.编写AAA模块的配置菜单(/driver/aaa/config.in):comment AAA Driver config#

14、AAA driver module config#bool use A1 COFNIG_AAA_A1bool use A2 COFNIG_AAA_A2,29,示例:如何添加一个新的模块,3.编写aaa模块的makefile文件(/driver/aaa/makefile):O_TARGET:=_sub_aaa.osubdir-y:=obj-y:=obj-$(CONFIG_AAA_A1)+=a1.o obj-$(CONFIG_AAA_A2)+=a2.oinclude$(TOPDIR)/Rules.make,30,示例:如何添加一个新的模块,4.修改driver模块的配置文件(/driver/con

15、fig.in):在/driver/config.in中加入对AAA的配置bool Support AAA CONFIG_AAA#Config AAAif$CONFIG_AAA=y;theninclude driver/aaa/config.infi5.修改上一级目录的makefile(/driver/makefile):在/driver/makefile中加入subdir-$(CONFIG_AAA)+=aaa,31,第五步:载入程序,Boot下更新程序的方法按Ctrl+b进入Boot模式使用Xmodem更新Boot或CtrlCtrl/Bootloader下载入程序的方法Ctrl+c进入Ctrl

16、模式或Bootloader模式使用Xmodem或TFTP功能更新Ctrl/Bootloader或Main注意:Boot/Bootloader/Ctrl不得轻易更新,否则会导致设备无法启动。Xmodem/TFTP的具体操作请参见各模式下的帮助信息(使用help命令),32,开发环境 开发基本流程 子系统 常用调试方法,33,子系统介绍,为何要使用子系统可卸载性模块的初始化子系统的类型不可卸载的子系统-内存管理模块可卸载的子系统-一些协议模块,34,子系统初始化阶段划分,基础类初始化,链路层初始化,网络层初始化,应用层初始化,驱动初始化,最终阶段,基础类(SUBSYS_CLASS_BASIC):被

17、后续所有模块依赖的模块并且不依赖于任何其他应用模块,链路层模块(SUBSYS_CLASS_LINKLAYER):链路层框架、链路层协议(不含驱动),网络层模块(SUBSYS_CLASS_NETWORKLAYER):网络层框架和协议。,应用层模块(SUBSYS_CLASS_APPLICATION):网络层框架和协议。,驱动(SUBSYS_CLASS_DRIVER):各种驱动,如PCI等,最终阶段(SUBSYS_CLASS_LAST):从初始化顺序上讲必须位于上述阶段之后的模块,35,可卸载子系统的创建,1.编写子系统2.编写配置文件3.修改makefile文件,36,编写子系统,1.明确本模块需

18、要在哪个阶段初始化2.明确子系统的依赖关系和初始化顺序关系3.明确本模块的初始化函数,37,子系统的定义,SUBSYS_DEFINE_00(subsysname,SUBSYS_CLASS_XXX,1,xxx_init,dependance,sequence);dependance子系统所依赖的其他子系统。若所依赖的子系统不存在,那么该子系统不能被初始化。sequence子系统初始化之前需要先初始化的子系统列表。列表中的子系统如果不存在,不会影响到该子系统的初始化,38,子系统的定义,例子:SUBSYS_DEFINE_00(a1,SUBSYS_CLASS_DRIVER,1,a1_init,“pc

19、i”,NULL);SUBSYS_DEFINE_00(a2,SUBSYS_CLASS_LINKLAYER,1,a2_init,NULL,NULL);SUBSYS_DEFINE_00(a3,SUBSYS_CLASS_LAST,1,a3_init,“a1,a2”,“a1,a2”);,39,子系统示例:Hello World,static void hello_main(unsigned long argc,void*argv)while(1)printk(Hello World!n);sleep(HZ);static void init_helloworld()printk(KERN_INFO St

20、art hello world task.n);hello_task=create_task(hello_world,hello_main,0,NULL,HELLO_TASK_STACK,APP_TASK_TS);SUBSYS_DEFINE_00(helloworld,SUBSYS_CLASS_LAST,1,init_helloworld,NULL,NULL);,40,开发环境 开发基本流程 子系统 常用调试方法,41,嵌入式开发调试的特点,编译与运行在不同平台交叉编译缺乏调试软件的支持PC端有gdb之类软件的支持嵌入式系统无法直接单步跟踪运行情况单步跟踪调试困难调试器数量有限,且使用比较困难

21、通过打印变量值观察分析,RGOS上的常用调试方法,打印分析+走读代码最常用、最有效的调试手段故障诊断命令的辅助debug support模式下的故障诊断命令show命令exec命令一键通命令,42,43,代码审查,代码自查与代码评审对照代码审查表上机调试前的必备工作指针运算要特别小心注意成对操作的匹配不要急着编译运行准备充分了吗?不要做浮躁的人,练习,搭建嵌入式开发环境,使PC能够通过串口线与目标设备通讯(串口有字符输入输出)练习工程能够正确编译通过,并加载到目标设备上运行(可以通过串口或网口加载)实现一个子系统,能够在目标设备上通过串口打印出“Hello World!”字符串。串口打印的函数为printk修改子系统初始化的阶段,看看串口打印“Hello World!”的时刻有什么变化,45,Thank You!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号