RTOS(程序员开发环境)_第1页
RTOS(程序员开发环境)_第2页
RTOS(程序员开发环境)_第3页
RTOS(程序员开发环境)_第4页
RTOS(程序员开发环境)_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、g system concepts abraham silberschatz peter baer galvin,greg gagne john wiley & sons,inc. 操作系统概念高等教育出版社 real-time concepts for embedded systemsreal-time concepts for embedded systems qing li,caroline yao cmp books 嵌入式系统的实时概念北京航空航天大学出版社 http:/ http:/ 开发环境n 开发基本流程n 子系统n 常用调试方法开发环境host 主机平台x86 + w

3、indows/linuxtarget目标平台ppc/mips/arm9交叉编译 在a平台上编译生成b平台运行的程序交叉编译器 为什么要交叉编译?目标平台缺乏编译环境 目标平台未建立 目标平台不支持直接主机编译(资源限制)10编译链接环境cygwincygwin 下载地址: ftp:/user42/#应用软件#/编译工具类/cygwin-20050107.rar 安装方式 略交叉编译器交叉编译器ftp:/user42/#应用软件#/编译工具类/gcc-compile/gcc3.4.4-ppc-eabi/1. 解压缩到cygwin的根目录下11启动引导方

4、式12代码结构根目录kernelarchdriverincludetargetppcmipspcii2carchdriverprojectmpc82xxsibytes57r36mainbootctrls57buildconfr36archkerneldrivertarget存放配置结果存放编译链接产生的中间文件和最终文件源代码文件programproject编译工程13n 开发环境n 开发基本流程n 子系统n 常用调试方法14开发基本流程第一步:编写源代码(略)第一步:编写源代码(略)第二步:编写源码相关的配置文件(包括第二步:编写源码相关的配置文件(包括makefilemakefile文件)

5、文件)第三步:进行工程配置第三步:进行工程配置第四步:编译第四步:编译第五步:将编译生成的程序载入到目标板上第五步:将编译生成的程序载入到目标板上第六步:运行程序第六步:运行程序15基础知识:几种重要的文件类型p 主主config.inconfig.in文件文件 位置:./scripts/ 作用:生成配置结果文件(.config)以及头文件(autoconf.h)p 主主makefilemakefile文件文件 位置:根目录下 作用:根据配置结果文件确定需要编译哪些子目录,并将这些子目录的.o文件链接成最终的目标文件16基础知识:几种重要的文件类型p config.in config.in文件

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

7、akes config命令3. 根据提示进行配置4. 执行./makes命令进行编译19第二步:编写配置文件 配置项的命名 必须以“config_”开头。 建议是“config_模块名_变量名” 的格式 配置项的定义 define_bool bool define_int int define_string string20第二步:编写配置文件 the alloc limits of packet buffer (config_packet_alloc_max) 4000 (new) 5000 support pci (config_pci) n/y/? (new) y default mai

8、n file name (config_main_file) (new) how many processors? (config_nr_cpus) 2 (new) 5 input errorhow many processors? (config_nr_cpus) 2 (new) 421第二步:编写配置文件 config.in文件中使用的条件判断bool open system debug config_sys_debugif $config_sys_debug = y ; then define_bool config_sys_assert yfi config.in文件的包含关系bool

9、 support redundancy? config_rdndif $config_rdnd = y ; then include kernel/rdnd/config.infi22第二步:编写配置文件23第二步:编写配置文件pmakefilemakefile文件的一般格式:文件的一般格式:o_target := _sub_xxx.o o_target := _sub_xxx.o # #注意:注意:xxxxxx为当前目录名为当前目录名subdir-y := d1 d2 subdir-y := d1 d2 # #我想编译当前目录下的哪些子目我想编译当前目录下的哪些子目录录obj-y := y1

10、.o y2.oobj-y := y1.o y2.o # #我想编译当前目录下的那些文我想编译当前目录下的那些文件件extra_cflags += -wallextra_cflags += -walloverride extra_include += -i$(topmk)/./includeoverride extra_include += -i$(topmk)/./include# #我还想将哪些目录作为系统头文件目录(可用我还想将哪些目录作为系统头文件目录(可用包含)包含)include $(topdir)/rules.makeinclude $(topdir)/rules.make # #

11、这个必须加这个必须加24第二步:编写配置文件pmakefile中如何使用配置项如:/driver/makefile中的一部分o_target := _sub_driver.oo_target := _sub_driver.osubdir-y := asyncsubdir-y := asyncsubdir-$(config_i2c) += i2csubdir-$(config_i2c) += i2csubdir-$(config_mtd) += mtdsubdir-$(config_mtd) += mtdsubdir-$(config_pci) += pcisubdir-$(config_pci

12、) += pci# # 当当.config.config文件中文件中config_pci=yconfig_pci=y时,实际上就等于:时,实际上就等于:# subdir-y+=pci# subdir-y+=pci25第二步:编写配置文件pmakefile中如何使用配置项26第三/四步:配置与编译p命令 配置:makes config 编译:makesp进行配置操作后生成的文件p进行编译操作后生成的文件 xxx.bin_可执行程序 xxx.disasm.gz压缩后的反汇编文件27示例:如何添加一个新的模块1. 新的模块目录就位2. 编写模块内部的配置菜单config.in3. 编写这个新目录内的

13、makefile4. 添加这个新模块的加载菜单5. 修改上一级目录的makefile28示例:如何添加一个新的模块例子:在driver目录下加入aaa设备的驱动模块.(假设该模块代码包括a1.c和a2.c)1. 确定aaa设备驱动模块所在的位置(/driver/aaa/目录下)2. 编写aaa模块的配置菜单(/driver/aaa/config.in):comment aaa driver configcomment aaa driver config# # aaa driver module config# aaa driver module config# #bool use a1 cof

14、nig_aaa_a1bool use a1 cofnig_aaa_a1bool use a2 cofnig_aaa_a2bool use a2 cofnig_aaa_a229示例:如何添加一个新的模块3. 编写aaa模块的makefile文件(/driver/aaa/makefile):o_target := _sub_aaa.oo_target := _sub_aaa.osubdir-y :=subdir-y :=obj-y :=obj-y :=obj- $(config_aaa_a1) += a1.o obj- $(config_aaa_a1) += a1.o obj- $(config_

15、aaa_a2) += a2.oobj- $(config_aaa_a2) += a2.oinclude $(topdir)/rules.makeinclude $(topdir)/rules.make30示例:如何添加一个新的模块4. 修改driver模块的配置文件( /driver/config.in ):在/driver/config.in中加入对aaa的配置bool support aaa config_aaabool support aaa config_aaa# config aaa# config aaaif $config_aaa = y ; thenif $config_aaa

16、 = y ; theninclude driver/aaa/config.ininclude driver/aaa/config.infifi5. 修改上一级目录的makefile( /driver/makefile ):在/driver/makefile中加入subdir-$(config_aaa) += aaasubdir-$(config_aaa) += aaa31第五步:载入程序pboot下更新程序的方法1. 按ctrl + b进入boot模式2. 使用xmodem更新boot或ctrlpctrl/bootloader下载入程序的方法1. ctrl + c进入ctrl模式或bootlo

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

18、的模块并且不依赖于任何其他应用模块 链路层模块(subsys_class_linklayer):链路层框架、链路层协议(不含驱动) 网络层模块(subsys_class_networklayer):网络层框架和协议。 应用层模块(subsys_class_application):网络层框架和协议。 驱动(subsys_class_driver): 各种驱动,如pci等 最终阶段(subsys_class_last): 从初始化顺序上讲必须位于上述阶段之后的模块 35可卸载子系统的创建1. 编写子系统2. 编写配置文件3. 修改makefile文件36编写子系统1. 明确本模块需要在哪个阶段初

19、始化2. 明确子系统的依赖关系和初始化顺序关系3. 明确本模块的初始化函数37子系统的定义l subsys_define_00(subsysname,subsys_class_xxx, 1, subsys_define_00(subsysname,subsys_class_xxx, 1, xxx_init, dependance, sequence);xxx_init, dependance, sequence); dependance子系统所依赖的其他子系统。若所依赖的子系统不存在,那么该子系统不能被初始化。 sequence子系统初始化之前需要先初始化的子系统列表。列表中的子系统如果不存在

20、,不会影响到该子系统的初始化38子系统的定义例子:subsys_define_00(a1, subsys_class_driver, 1, a1_init, “pci”, 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 worldstatic void hello_main(unsigned long argc, void *argv) while (1) printk(hello world!n); sleep(hz); static void init_helloworld() printk(kern_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论