虚有其表的意思是什么| 头疼是什么原因引起的| 潜血十一是什么意思| 急性肠胃炎可以吃什么水果| qaq是什么意思| 权志龙为什么这么火| 10月17是什么星座| 尿频尿急吃什么药| 荨麻疹可以吃什么食物| 放屁多吃什么药| 打车用什么软件| 中国铁塔是干什么的| cd56阳性是什么意思| 附身是什么意思| 菜鸟裹裹是什么快递| 龙的五行属性是什么| 胃炎糜烂吃什么食物好| mr是什么检查| 什么是节气| 缺锌会有什么症状| 爬山是什么意思| 皮肤真菌感染用什么药| 梦见自己吃面条是什么意思| mv是什么意思| 术前八项检查是什么| 害怕的近义词是什么| 胰腺炎有什么症状| 冻顶乌龙茶属于什么茶| 精神心理科主要治疗什么疾病| 吃茶叶蛋有什么好处和坏处| 无回声结节是什么意思| 史诗级什么意思| 颏下是什么部位| 伪军是什么意思| 大学休学1年有什么影响| 下身瘙痒用什么药| 经期为什么不能拔牙| 五行火生什么克什么| 裙带菜不能和什么一起吃| 最高法院院长什么级别| 1996年五行属什么| 咳嗽痰多吃什么药| 三点水一个高念什么| 下面痒是什么原因女性| 七七是什么意思| 外强中干什么意思| 儿童过敏性鼻炎吃什么药| s1隐裂是什么意思| ccf是什么| 精分是什么| 前列腺钙化是什么原因引起的| 什么的桌椅| 刚是什么意思| 亟是什么意思| 嬛嬛一袅楚宫腰什么意思| 异常出汗是什么原因| 过敏性鼻炎吃什么药能快速缓解| 嘉靖为什么不杀海瑞| 胃火吃什么中成药| 姜黄是什么东西| 右手大拇指抖动是什么原因| 美国是什么人种| 一什么月牙| 努尔哈赤是什么民族| 酒喝多了喝什么解酒| 三焦经在什么位置| 胃反流吃什么药效果好| 师夷长技以制夷是什么意思| 子宫癌筛查做什么检查| 蜂蜜什么时候喝最好| 心电图窦性心动过缓是什么意思| 维生素b6主治什么病| 低血糖什么症状有哪些| 爱出油的人身体缺什么| 为什么月经老是提前| 发财树为什么叫发财树| 胃病吃什么好| 生茶和熟茶有什么区别| 狗尾续貂什么意思| 螨虫用什么药膏| 灵枢是什么意思| 人突然晕倒是什么原因引起的| 梦见被狗追是什么意思| 梦见包饺子是什么征兆| 阴历六月十八是什么日子| 虚岁30岁属什么生肖| 人设什么意思| 什么叫糖化血红蛋白| 你喜欢我什么我改| 进击的巨人真相是什么| 今天生日什么星座| 狒狒是什么意思| 杂交金毛犬长什么样子| tag是什么意思| 经常腰疼是什么原因女| 呜呼哀哉什么意思| 鱼眼睛吃了有什么好处| 心脏骤停是什么原因引起的| 考法医需要什么条件| 人为什么会感冒| 什么是宫颈息肉| 月经期体重增加是什么原因| 真言是什么意思| 什么叫间质性肺病| 什么是红肉| 嬴姓赵氏是什么意思| 什么是数位| 被和谐了是什么意思| 重庆五行属什么| 甲钴胺是治什么病的| 浅卡其色裤子配什么颜色上衣| 属马跟什么属相犯冲| 耳后淋巴结肿大吃什么消炎药| 女人十个簸箕是什么命| 为什么要流泪| 无力感是什么意思| 金刚是什么意思| 过敏性紫癜是什么病| 尼哥是什么意思| 核磁共振挂什么科| 屁股黑是什么原因| 猫吃什么下奶最快最多| 眼底出血是什么原因引起的| 三什么六什么| 屁股疼挂什么科| 雪蛤是什么| 问其故的故是什么意思| 隔空是什么意思| 香港的别称是什么| npc什么意思| 6月初9是什么日子| 浮世清欢什么意思| 手的皮肤黄是什么原因| 痛经 吃什么| 痛风吃什么中药最有效| 药品经营与管理学什么| 极乐是什么意思| 安宫牛黄丸什么时候吃最好| 图字五行属什么| 阿胶适合什么人吃| 看什么看| 一念之间什么意思| 类风湿是什么意思| 看脑血管挂什么科| 梦见被追杀是什么预兆| 打呼噜去医院挂什么科| 对什么| 枕头太低了有什么危害| 儿童过敏性鼻炎吃什么药| 从子是什么意思| 小肠换气吃什么药| 健胃消食片什么时候吃最好| cas是什么| 右脸颊长痘是什么原因| 萎缩性胃炎什么意思| socks是什么意思| xn是什么意思| 哈密瓜为什么叫哈密瓜| 胆结石是什么症状| 盐酸西替利嗪片主治什么| 胆囊挂什么科| 做爱时间短吃什么药好| 小时的单位是什么| 梅雨季节是什么时间| 十月底是什么星座| 册封是什么意思| 动脉血是什么颜色| 梭子蟹什么季节吃最好| 1119是什么星座| 曾毅玲花什么关系| 张杰属什么生肖| 胃酸是什么原因| 举贤不避亲什么意思| 被舔下面是什么感觉| 珉字五行属什么| 开飞机什么意思| 梦见老人死了又活了是什么意思| 皮肤癣是什么原因造成的| 喝脱脂牛奶有什么好处| 肝火旺吃什么中成药| 中暑是什么感觉| 头疼流鼻血是什么原因| 脑供血不足食补吃什么| 三点水一个半读什么| 雷字五行属什么| 小便憋不住尿裤子是什么情况| 促甲状腺激素偏高有什么症状| 水瓶座是什么星象| 什么样的伤口算开放性| 打冷是什么意思| 莆田荔枝什么时候成熟| 阴道清洁度三度什么意思| 宁字属于五行属什么| 卤牛肉放什么调料| 婴儿哭久了有什么危害| 息肉是什么东西| rr是什么牌子| 男人交生育保险有什么用| 淮山跟山药有什么区别| 医是什么结构| 敕令是什么意思| 什么东西蛋白质最高| 五月十三是什么星座| 排卵试纸一深一浅说明什么| 棱长是什么| 劣质是什么意思| 牛肉粉是什么调料| 月经期间吃什么水果好| 炖牛肉放什么调料好吃| 犹太人为什么那么聪明| 胰腺炎吃什么药好| 乙型肝炎表面抗体阳性是什么意思| 耳火念什么| 什么床不能睡觉| 没事找事是什么意思| 我可以组什么词| 人参片泡水喝有什么功效和作用| alan什么意思| 斐字五行属什么| 布克兄弟什么档次| 纯水是什么| 貔貅五行属什么| nsaid是什么药| 腰闪了是什么症状| 为什么不能送手表| 情商低是什么意思| 任性的女孩有什么特点| 受凉胃疼吃什么药| bgm是什么意思| 洗冷水澡有什么好处| 红蜘蛛用什么药最有效| 吃了火龙果不能吃什么| 心窝窝疼是什么原因| 俱往矣是什么意思| 不怀孕是什么原因引起的| 什么饮料解渴| plano是什么意思| 尿酸高吃什么药最好| 经信局是干什么的| 蝙蝠粪便是什么中药| 木驴是什么| 涟漪是什么意思| 汗疱疹涂什么药膏| 户名是什么| 81年五行属什么| 阴道有腥味是什么原因| 什么是早恋| 画龙点睛什么意思| 推荐是什么意思| 康熙的儿子叫什么| 为什么会掉头发| 硼砂是干什么用的| 石斛的作用是什么| 送呈是什么意思| 冰箱底部漏水是什么原因| 落花流水什么意思| 不甚是什么意思| 什么的城市| 眼底出血吃什么药| 谷丙转氨酶偏高说明什么原因| 来大姨妈拉肚子是什么原因| 什么能增强免疫力| 无意间是什么意思| 肿标五项查的是什么| 百度

新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 使用ADS移植uC/OS-II实例分析

Tourists visit village of Merzouga in Morocco(1)

作者: 时间:2025-08-04 来源:网络 收藏
选择开发工具在嵌入式系统设计中,开发工具的选取是一个重要的考虑因素,通常这是与开发项目的需求和应用背景相关。一般嵌入式开发工具包含用于目标系统的交叉编译器、连接器、调试器以及辅助处理用的二进制文件分析工具等。

目前可以用来编译链接产生 处理器执行代码的开发工具主要有如下几类:1. 公司提供的 Developer Suite 集成开发环境主要工具有 armasm、armcc、armlink、fromelf 等。

2. GNU 组织提供的 tool chain for arm主要工具有 arm-elf-gcc、arm-elf-gdb、arm-elf-objcopy 等3. Microsoft公司提供的 eMbedded Visual Tools主要工具有 clarm、clthumb、c2_arm、link、lib等这里我们选用 ARM 公司提供的 下的工具集来编译我们的程序和链接目标代码并最终生成可执行的二进制映像。这里介绍一下主要会用到的一些工具:armasm.exe : 汇编文件编译器armcc.exe : C 文件编译器armlink.exe : 目标文件连接器fromelf.exe : 用于将 axf 或者 elf 格式转换成其他格式的文件,例如二进制映像。

armprof.exe : 对调试过程中生成的 profiling 记录文件做分析用的工具软件启动代码由于板子的 0x0 地址处是 32M 的Flash ROM,因此在板子加电后,会从 Flash 中顺序执行启动代码。为了能使得mC/OS-II 运行,启动代码需要完成如下工作:1. 设置 异常向量表,即在 0x0-0x1c 位置放置7条跳转指令(其中 0x14 为空)

2.分别实现每种异常的处理程序,其中包括 Reset_Handler、Undefined_Handler、SWI_Handler、Prefetch_Handler、Abort_Handler、IRQ_Handler、FIQ_Handler. 3. 程序从 Reset_Handler 进入后,需要首先进行相关硬件的初始化操作,例如 初始化SDRAM、CPU speed、Interrupt Controller、UART、timer 等。

4. 建立每种异常状态下的系统堆栈,为了简单起见可以只在 svc 态 和 irq 态下建立堆栈:setup_svc_stack,setup_irq_stack. 5. 强制 arm 处理器状态转换为 svc 管理态。

6. 跳转到mC/OS-II 代码的 main 入口,实际上是编译链接后产生的 __main 入口。

时钟与中断处理时钟控制逻辑在图1中,有4种和系统时钟相关寄存器,它们的含义如下:● OSCR: 一个自动递增计数的 32 位计数器。

● OSMR3-0: 4 个 32 位的匹配寄存器,当 OSCR 的值匹配时产生中断。

● OSSR: 状态寄存器,当 OSCR 和 OSMR 匹配时,会对 OSSR 做标志。

● OIER: 使能寄存器,表示当匹配发生时,允许在 OSSR 设置一个标识位。

OSCR 在自动累加的过程中,与OSMR里面设定的那些匹配寄存器进行匹配,发现有匹配的事件时,就会对 OSSR 中的相应位置设一个标志位“1”,表示OSCR与对应的OSMR 发生了匹配。当然这个匹配发生的前提是发生匹配的那个OSMR在OIER中的相应位被使能,否则OSMR中的设置将不起作用。

系统时钟初始化流程mC/OS-II 中创建的第一个任务将负责启动时钟节拍,时钟的初始化设置流程如下:1) 设置 OSMR0 = x ,表示 初始化 OSMR0,即当计数器为x时发生匹配2) 设置 OSSR = 0xf ,表示 清除所有已经发生的匹配,写“1”清除3) 设置 OIER = OIER_EO ,表示 使能 OSMR0 来产生匹配4) 设置 OSCR = 0 ,表示 初始化计数器的开始值 为 0系统时钟中断复位1) 清除 OSSR 中的相应位,即向发生匹配的OSMR的那个对应位写“1”

2) 设置 OSCR = 0 ,表示 继续初始化计数器的值为 0中断控制器相关的寄存器● ICPR: 中断标示寄存器,表示了当前系统正处于激活状态的中断源。

● ICMR: 中断屏蔽寄存器,用来屏蔽相应位的中断。

● ICLR: 中断级别设置寄存器,设定报告中断的级别是 IRQ 或者是 FIQ .● ICIP: IRQ 级别的中断源寄存器,用来标识 IRQ 中断发生的源设备。

● ICFP: FIQ 级别的中断源寄存器,用来标识 FIQ 中断发生的源设备。

中断控制器初始化流程1) 设置 ICMR 屏蔽位为不屏蔽时钟中断 OSMR0 (相应位写“1”)

2) 设置 ICLR 为都报告为 IRQ 级别(所有位写“0”)

移植工作总结难点分析移植mC/OS-II 到 StrongARM 的芯片上,基本上和移植到 ARM7 的芯片例如S3C4510,AT91x等工作类似,因为所有的ARM处理器都共享arm通用的基础体系结构,这使得移植工作变得相对简单,其中绝大部分工作都集中在 os_cpu_a.S 文件的移植,这个文件的实现集中体现了所要移植到处理器的体系结构和mC/OS-II 的移植原理;在这个文件里,最困难的工作主要是在 OSIntCtxSw 和 OSTickISR 这两个函数的实现上。因为它们的实现是和移植者的移植思路以及相关硬件定时器、中断寄存器的设置有关。在实际的移植工作中,这两个地方也是比较容易出错的地方。

OSIntCtxSw 最重要的作用就是它完成了在中断ISR中直接进行任务切换,从而提高了实时响应的速度。它发生的时机是在 ISR 执行到 OSIntExit 时,如果发现有高优先级的任务因为等待的 time tick 到来获得了执行的条件,这样就可以马上被调度执行,而不用返回被中断的那个任务之后再进行任务切换,因为那样的话就不够实时了。

实现 OSIntCtxSw 的方法大致也有两种情况:一种是通过调整 sp 堆栈指针的方法,根据所用的编译器对于函数嵌套的处理,通过精确计算出所需要调整的 sp 位置来使得进入中断时所作的保存现场的工作可以被重用。这种方法的好处是直接在函数嵌套内部发生任务切换,使得高优先级的任务能够最快的被调度执行。但是这个办法需要和具体的编译器以及编译参数的设置相关,需要较多技巧。

另一种是设置需要切换标志位的方法,在 OSIntCtxSw 里面不发生切换,而是设置一个需要切换的标志,等函数嵌套从进入OSIntExit => OS_ENTER_CRITICAL() => OSIntCtxSw() => OS_EXIT_CRITICAL() => OSIntExit退出后,再根据标志位来判断是否需要进行中断级的任务切换。这种方法的好处是不需要考虑编译器的因素,也不用做计算,但是从实时响应上不是最快,不过这种方法实现起来比较简单。

在中断态下进行任务切换,需要特别说明的一个问题是如何获得被中断任务的 lr_svc .因为进入中断态后,lr 变成了lr_irq ,原来任务的 lr_svc 无法在中断态下获得,这样要得到lr_svc,就必须在中断 ISR 里面进行一次cpu mode强制转换,即对CPSR赋值为0x000000d3,只有返回到svc态之后才能得到 原来任务的lr,这个对于任务切换很重要。还有一个需要留意的问题是在强制CPSR变成svc态之后,SPSR 也会相应地变成 SPSR_irq,这样就需要在强制转变之前保存 SPSR ,也就是被中断任务中断前的 CPSR .移植中使用的编程技巧 编译器在编译 C 语言的程序时,如果程序中使用了 main 函数,则编译器将自动添加如下代码,完成初始化堆栈和C库等工作,工作流程如下:1> 将执行文件中的 RO 段和 RW 段从 load address 复制到 execution address 2> 初始化 ZI 区域,用 0 来初始化变量3> 跳转到 __rt_entry 执行如下 4 个调用3.1> 调用 __rt_statckheap_init ,建立程序的堆和栈3.2> 调用 __rt_lib_init ,初始化程序用到的 C 库,并为 main 传递参数3.3> 调用 main ,即用户程序的入口3.4> 调用 exit因为系统复位后,在启动代码中已经设置了系统堆栈,同时也不需要使用C库,因此可以从 __rt_entry 处直接跳转到mC/OS-II 的代码中,即直接执行 main 函数,可以用新的 __rt_entry 来作为链接的目标入口。

IMPORT main EXPORT __rt_entry __rt_entry b main这样在启动代码的最后,加入一条跳转语句:bl __main __main 入口是用户程序执行的真正入口,我们利用 armCC 编译 C 里面的 main 入口以求得到 1> 和 2> 的代码,使得可以支持全局变量。否则的话,必须自己来实现全局变量的初始化或者把这些初始化操作放到函数内部来实现。

另外一个非常有用的编程技巧是通过串口实现自己的 printf 输出。 如果使用armCC编译器的 semihosting 的话,会把 printf 通过 target 的 swi 0x123456 输出。如果已经实现的 serial_putchar 之类的函数,那么可以用它来实现 fputc 接口,也就是低级的输出函数,这样就可以使用 printf 来输出了,详细的做法在 安装目录下面的文档里可以找到,这里就不再赘述


关键词: uCOS-II ADS ARM

评论


相关推荐

技术专区

关闭
术后吃什么消炎药 牛肉和什么菜包饺子好吃 肘是什么意思 白芍有什么功效和作用 伤口不愈合是什么原因
二月出生是什么星座 口腔扁平苔藓挂什么科 奥美拉唑和雷贝拉唑有什么区别 棕色皮鞋配什么颜色裤子 周知是什么意思
尿酸高可以吃什么水果 子宫内膜异位症有什么症状 怕老婆的男人说明什么 mfg是什么意思 王字旁一个行念什么
16是什么生肖 螺旋体感染是什么意思 稍纵即逝什么意思 孩提是什么意思 伪娘是什么
日本的町是什么意思hcv8jop1ns1r.cn 肠脂膜炎是什么病严重吗hcv8jop7ns1r.cn 蜈蚣吃什么hcv9jop4ns6r.cn 腊月是什么星座hcv9jop2ns6r.cn 肾囊肿挂什么科xjhesheng.com
九月二十三是什么星座hcv7jop7ns2r.cn 炼蜜是什么jiuxinfghf.com 装修属于什么行业hcv8jop7ns3r.cn 天妇罗是什么意思hcv8jop6ns2r.cn 孟力念什么tiangongnft.com
脑血栓不能吃什么水果hcv9jop4ns3r.cn 射手座属于什么星象hcv7jop5ns6r.cn 幽门螺旋杆菌是什么原因造成的dajiketang.com 肌肤是什么意思hcv9jop1ns3r.cn 撬墙角是什么意思liaochangning.com
布洛芬有什么副作用hcv9jop0ns9r.cn rm是什么币hcv9jop5ns1r.cn 良心是什么意思hcv9jop0ns6r.cn 1月28号是什么星座hcv8jop8ns1r.cn 蜈蚣为什么不能打死hcv9jop1ns3r.cn
百度