首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

实时操作系统mC/OS-II在AT91上的移植 02

实时操作系统mC/OS-II在AT91上的移植 02

这里时钟节拍设为100次每秒,使用定时器0来完成该任务。时钟节拍中断OSTickISR()代码如下,此时系统进入IRQ模式。
STMFD  SP!, {R0-R3, R12, LR}
BL      OSIntEnter        
BL      Tmr_TickISR_Handler
BL      OSIntExit        
LDR     R0,addr_OSIntCtxSwFlag
LDR     R1, [R0]
CMP     R1, #1
BEQ     OS_IntCtxSw     
LDMFD SP!, {R0-R3,R12,LR}  
SUBS    PC, LR, #4     
    Tmr_TickISR_Handler是中断处理程序,用C语言编写。如果是其他类型的中断,可以替换为相应的中断处理程序。这里定时器0中断处理程序要做的工作是首先清中断源,即读取TC_SR寄存器值,AIC_ICCR=0x00000010,然后告诉处理器中断结束(向AIC_EOICR写数据),最后调用OSTimeTick()函数,对延时记号进行处理。
定时器0的设置为:WAVE模式;TC_CMR中CPCTRG=1,表示RC比较将复位计数器并开启时钟;TC_RC=计时时间;TC_IER=AT91C_TC_CPCS,允许RC比较中断。
移植中要注意的问题
    由于各方面的原因,移植中编写的代码不一定完全正确,需要进行逐步调试。调试过程中,要善于根据具体现象来发现问题所在。根据笔者的调试经历,总结了一些移植调试过程中要注意的问题。
(1) 对mC/OS-II的内核机理要有充分理解。可以尝试对其内核进行调试,这样可以帮助自己从更深的层次来理解嵌入式实时操作系统。只有对mC/OS-II的内核有了清楚地认识,才能在移植过程中发现问题的本质。
(2) 对所使用的编译器要有深刻细致的了解。由于ADS1.2的C 编译器有很多优化编译选项和流水处理选项,在处理内核编译时很容易有冲突,所以,选择优化选项要慎重。加强对ADS1.2的C 编译器的理解,可以节约代码编写时间。
(3) 在移植过程中,最容易出问题的就是堆栈处理。堆栈处理是操作系统移植的关键部分。先分析arm系统自身在进行现场保护时的堆栈处理的操作,然后模拟其过程。关键是要将需要的寄存器都保护到。由于我们在进行任务切换的时候采用了系统函数来进行现场保护,因此在堆栈初始化的时候,就应该按照这两个函数的操作来对任务堆栈进行初始化。
(4) 要详细分析ARM系统自自身处理中断时的压栈操作,必须将多余的信息从堆栈中清理干净。如果对编译器不熟悉,可以通过仔细调试中断,来确定编译器的具体操作。在对AT91FR40162的移植中,由于arm处理器有7种运行模式,每种运行模式下都有自己独立的寄存器,所以在处理中断的过程中,要注意运行模式的切换,避免寄存器的内容无法正确保存和恢复。
(5) 注意程序的返回地址。异常中断发生时,程序计数器PC所指的位置对各种不同的异常中断是不同的,所以,返回地址也是不同的。需要根据不同的中断类型,确定不同的中断返回地址偏移量,
返回列表