已阅读5页,还剩40页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,RTOS编程培训,2,课程目的,掌握RGOS线程调度的基本原理 熟练应用IPC进行多线程开发 掌握RGOS的中断和定时器管理机制 掌握RGOS内存管理的正确使用方法 学会搭建RGOS的编程环境,掌握基本的嵌入式开发和调试技能,3,考核方式,笔试(闭卷) 60% 上机 40% 编程练习 上机调试,4,课程内容,开发环境与调试方法 系统调度、中断与线程间通信 多线程开发常见问题、定时器与内存管理,5,学习指导,RGOS的一些基本概念注意理解和区分 理解并掌握各种机制的应用场合 对开发过程中的约束和注意事项要牢记 接口只要在要用的时候会用即可,参考资料,Operating System Concepts Abraham Silberschatz Peter Baer Galvin,Greg Gagne John Wiley & sons,Inc. 操作系统概念高等教育出版社 Real-Time Concepts For Embedded Systems Qing Li,Caroline Yao CMP Books 嵌入式系统的实时概念北京航空航天大学出版社 /platform/howto/index.html /platform/api/index.html,7,开发环境与调试方法,开发环境 开发基本流程 子系统 常用调试方法,开发环境,host 主机平台 X86 + Windows/Linux,Target 目标平台 PPC/MIPS/ARM,9,交叉编译,在A平台上编译生成B平台运行的程序 交叉编译器 为什么要交叉编译? 目标平台缺乏编译环境 目标平台未建立 目标平台不支持直接主机编译(资源限制),10,编译链接环境,Cygwin 下载地址: ftp:/user42/#应用软件#/编译工具类/Cygwin-20050107.rar 安装方式 略 交叉编译器 PPC:ftp:/user42/#应用软件#/编译工具类/gcc-compile/gcc3.4.4-ppc-eabi/ 其他:需要时再找 安装方式: 解压缩到cygwin的根目录下 将交叉编译器的bin目录添加到系统环境变量“path”中,11,启动引导方式,交换机:三级引导 Boot - Ctrl - Main 路由器:二级引导 Bootloader - Main 为什么需要多级引导? Boot:功能最简单,负责初始化最基本的运行环境。仅能使用串口进行对外交互。 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,编译工程,13,开发环境与调试方法,开发环境 开发基本流程 子系统 常用调试方法,14,开发基本流程,第一步:编写源代码(略) 第二步:编写源码相关的配置文件(包括makefile文件) 第三步:进行工程配置 第四步:编译 第五步:将编译生成的程序载入到目标板上 第六步:运行程序,15,基础知识:几种重要的文件类型,主config.in文件 位置:./scripts/ 作用:生成配置结果文件(.config)以及头文件(autoconf.h) 主makefile文件 位置:根目录下 作用:根据配置结果文件确定需要编译哪些子目录,并将这些子目录的.o文件链接成最终的目标文件,16,基础知识:几种重要的文件类型,config.in文件 位置:各个模块所在目录 作用:对当前模块进行配置,以支持模块的卸载和添加 makefile文件 位置:各个源文件所在目录 作用:根据配置确定该目录下的哪些源文件和子目录需要被编译 以上两个文件统称为该模块的配置文件,17,基础知识:几种重要的文件类型,Rules.make 位置:根目录下 作用:确定编译的依赖规则,并根据配置文件逐层递归遍历每个目录下的各个子目录,编译生成对应的.o文件,18,如何进行配置和编译,例子:S57主程序的配置 (Program:main; Project:s57) 1. 进入/project/main/s57/目录 2. 执行./makes config命令 3. 根据提示进行配置 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 0x4000 define_bool CONFIG_CPM2PIC y bool Support PCI CONFIG_PCI string Default main file name CONFIG_MAIN_FILE int 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 error How Many processors? (CONFIG_NR_CPUS) 2 (NEW) 4,21,第二步:编写配置文件,config.in文件中使用的条件判断 bool Open SYSTEM Debug CONFIG_SYS_DEBUG if “$CONFIG_SYS_DEBUG“ = “y“ ; then define_bool CONFIG_SYS_ASSERT y fi config.in文件的包含关系 bool Support redundancy? CONFIG_RDND if “$CONFIG_RDND“ = “y“ ; then include kernel/rdnd/config.in fi,22,第二步:编写配置文件,配置项的最终保存方式 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 += -Wall override EXTRA_INCLUDE += -I$(TOPMK)/./include #我还想将哪些目录作为系统头文件目录(可用包含) include $(TOPDIR)/Rules.make #这个必须加,24,第二步:编写配置文件,Makefile中如何使用配置项 如:/driver/makefile中的一部分 O_TARGET := _sub_driver.o subdir-y := async subdir-$(CONFIG_I2C) += i2c subdir-$(CONFIG_MTD) += mtd subdir-$(CONFIG_PCI) += pci # 当.config文件中CONFIG_PCI=y时,实际上就等于: # subdir-y+=pci,25,第二步:编写配置文件,Makefile中如何使用配置项 Ifeq (“$(CONFIG_UART_LL)“, “y“) obj-y += uart_debug.o else obj-y += uart.o Endif 思考:能否使用obj- $(CONFIG_UART_LL)这种方式?,26,第三/四步:配置与编译,命令 配置:makes config 编译:makes 进行配置操作后生成的文件 Program/Project/conf/.config(配置结果文件) Program/Project/conf/autoconf.h(配置结果头文件) 进行编译操作后生成的文件 xxx.bin_ 可执行程序 xxx.disasm.gz 压缩后的反汇编文件 其他文件,27,示例:如何添加一个新的模块,1. 新的模块目录就位 2. 编写模块内部的配置菜单config.in 3. 编写这个新目录内的Makefile 4. 添加这个新模块的加载菜单 5. 修改上一级目录的Makefile,28,示例:如何添加一个新的模块,例子:在driver目录下加入AAA设备的驱动模块. (假设该模块代码包括a1.c和a2.c) 1. 确定AAA设备驱动模块所在的位置(/driver/aaa/目录下) 2. 编写AAA模块的配置菜单(/driver/aaa/config.in): comment AAA Driver config # # AAA driver module config # bool use A1 COFNIG_AAA_A1 bool use A2 COFNIG_AAA_A2,29,示例:如何添加一个新的模块,3. 编写aaa模块的makefile文件(/driver/aaa/makefile): O_TARGET := _sub_aaa.o subdir-y := obj-y := obj- $(CONFIG_AAA_A1) += a1.o obj- $(CONFIG_AAA_A2) += a2.o include $(TOPDIR)/Rules.make,30,示例:如何添加一个新的模块,4. 修改driver模块的配置文件( /driver/config.in ): 在/driver/config.in中加入对AAA的配置 bool Support AAA CONFIG_AAA # Config AAA if “$CONFIG_AAA“ = “y“ ; then include driver/aaa/config.in fi 5. 修改上一级目录的makefile( /driver/makefile ): 在/driver/makefile中加入 subdir-$(CONFIG_AAA) += aaa,31,第五步:载入程序,Boot下更新程序的方法 按Ctrl + b进入Boot模式 使用Xmodem更新Boot或Ctrl Ctrl/Bootloader下载入程序的方法 Ctrl + c进入Ctrl模式或Bootloader模式 使用Xmodem或TFTP功能更新Ctrl/Bootloader或Main 注意:Boot/Bootloader/Ctrl不得轻易更新,否则会导致设备无法启动。 Xmodem/TFTP的具体操作请参见各模式下的帮助信息(使用help命令),32,开发环境与调试方法,开发环境 开发基本流程 子系统 常用调试方法,33,子系统介绍,为何要使用子系统 可卸载性 模块的初始化 子系统的类型 不可卸载的子系统 - 内存管理模块 可卸载的子系统 - 一些协议模块,34,子系统初始化阶段划分,基础类初始化,链路层初始化,网络层初始化,应用层初始化,驱动初始化,最终阶段,基础类 (SUBSYS_CLASS_BASIC): 被后续所有模块依赖的模块并且不依赖于任何其他应用模块,链路层模块(SUBSYS_CLASS_LINKLAYER): 链路层框架、链路层协议(不含驱动),网络层模块(SUBSYS_CLASS_NETWORKLAYER): 网络层框架和协议。,应用层模块(SUBSYS_CLASS_APPLICATION): 网络层框架和协议。,驱动(SUBSYS_CLASS_DRIVER): 各种驱动,如PCI等,最终阶段(SUBSYS_CLASS_LAST): 从初始化顺序上讲必须位于上述阶段之后的模块,35,可卸载子系统的创建,1. 编写子系统 2. 编写配置文件 3. 修改makefile文件,36,编写子系统,1. 明确本模块需要在哪个阶段初始化 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, “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 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 “Start hello world task.n“);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房顶安全合同协议书
- 手机售卖协议书范本
- 手机销售保密协议书
- 打印作业协议书模板
- 打桩头劳务合同范本
- 托管服务协议书范本
- 黔东南苗族侗族自治州国家职业技能鉴定考评员理论考试试卷及答案
- 2025年甘肃省公务员考试行测言语理解专项训练试卷(含答案)
- 投资教育新手指南:耐心与价值投资的启示
- 云技术引领:数字经济的未来发展与创新策略
- 崇明区育儿嫂合同
- 2025年大学生创业孵化基地可行性研究报告及总结分析
- 2025年新安全生产法应知应会知识竞赛题库含答案
- 2025年出台民政局离婚协议合同范本
- 车辆出口物流合同范本
- 2025年甘肃省庆阳市林业和草原局招聘专职聘用制护林员92人笔试考试参考题库及答案解析
- 十五五规划纲要:绿色金融衍生品创新与风险管理
- 浅谈无人机技术在公安警务工作中的应用及前景
- 《杀死一只知更鸟》课件
- 山东省青岛市2025-2026学年高三上学期期初调研检测数学试题(含解析)
- 电力反违章安全培训课件
评论
0/150
提交评论