您的位置 首页 IC

嵌入式操作系统移植实例:运用ADS移植uC/OS-II

选择开发工具在嵌入式系统设计中,开发工具的选取是一个重要的考虑因素,通常这是与开发项目的需求和应用背景相关。一般嵌入式开发工具包含用

挑选开发东西在嵌入式体系规划中,开发东西的选取是一个重要的考虑要素,一般这是与开发项目的需求和运用布景相关。一般嵌入式开发东西包含用于方针体系的穿插编译器、连接器、调试器以及辅佐处理用的二进制文件剖析东西等。

现在能够用来编译链接产生 ARM 处理器履行代码的开发东西首要有如下几类:1. ARM 公司供给的 ARM 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 公司供给的 ADS 下的东西集来编译咱们的程序和链接方针代码并终究生成可履行的二进制映像。这儿介绍一下首要会用到的一些东西: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 .移植中运用的编程技巧ADS 编译器在编译 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 来作为链接的方针进口。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/299530.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部