![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| ucos在DSP TMS320F2812上的移植 | |||||
作者:Free 文章来源:Free 点击数: 更新时间:2008-1-4 ![]() |
|||||
|
所谓移植,就是使一个实时内核能在某个微处理器或者微控制器上运uC/OS-II的大部分代码用C语言编写,且在设计时充分考虑了移植性,所以移植相对容易。 移植概述 1.移植uC/OS-II的要求 ①采用C语言的编译器可产生可重入的代码,且能在C语言中插入汇编语言。 ②C语言就可以打开、关闭中断。 ③处理器支持中断,并能产生定时中断,一般在10ms到100ms之间。 ④处理器支持能够容纳一定数据量的硬件堆栈。 ⑤处理器有将堆栈指针和其他CPU寄存器读出和存储到堆栈或内存中的指令。 ⑥移植者应熟练掌握CCS编译器和DSP编程模型的细节。 2.移植uC/OS-II的工作内容 ①在OS_CPU.H中用#define定义常量的值,声明10个数据类型。 ②在OS_CPU_C.C中用C语言编写6个简单函数。 ③在OS_CPU_A.ASM中编写4个汇编语言函数。 移植过程与关键点 1.移植过程阐述 ①首先在OS_CPU.H中定义常量堆栈的增长方向(OS_STK_GROWTH=1)为从高到低,然后定义与开中断、关中断以及任务与任务间切换的宏。 (1) 堆栈增长方向定义 #define OS_STK_GROWTH /*=1表示堆栈从上往下增长*/ (2)开关中断 OS_ENTER_CRITICAL() OS_EXIT_CRITICAL() (2) 任务切换宏定义 #define OS_TASK_SW() OSCtxSw() 其中OSCtxSw()在OS_CPU_A.S中定义 ②在OS_CPU_A.ASM中定义5个汇编函数 (1)开、关中断定义 #define OS_CRITICAL_METHOD 2 #if OS_CRITICAL_METHOD == 1 #define OS_ENTER_CRITICAL() asm("SETC INTM ") /* Disable interrupts */ #define OS_EXIT_CRITICAL() asm("CLRC INTM ") /* Enable interrupts */ #endif #if OS_CRITICAL_METHOD == 2 #define OS_ENTER_CRITICAL() asm("SETC INTM ") /* Disable interrupts*/ #define OS_EXIT_CRITICAL() asm("CLRC INTM ") /* Enable interrupts */ #endif (2)运行第一个任务函数定义 操作系统uCOS-II启动时使用OSStartHighRdy运行第一个任务,它将调用OSTaskSwHook(),然后设置OSRunning为TRUE,最后切换到优先级最高且处于就绪状态的任务。 OSStartHighRdy . .page .text _OSStartHighRdy: .global _OSStartHighRdy .ref _OSTCBHighRdy MOVW DP,#_OSTCBHighRdy ;//SP = OSTCBhighRdy->OSTCBStkPtr MOVL XAR4,@_OSTCBHighRdy MOV AL,*+XAR4[0] MOV @SP,AL POP RPC IRET .end. (3)任务切换函数定义 该函数在系统模式下被调用,且FIQ,IRQ被禁止,其功能包括保存当前任务上下文到当前任务堆栈.主要功能包括: ◆设置OSTCBCur->OSTCBStkPtr=SP; ◆调用OSTaskSwHook();设置OSPrioCur=OSPrioHighRdy; ◆设置OSTCBCur =OSTCBHighRdy; ◆设置SP=OSTCBHighRdy->OSTCBStkPtr; ◆从新TASK的堆栈恢复新TASK的上下文,执行新的TASK, ◆其中OSTCBCur指向挂起任务的,OS_TCBOSTCBHighRdy指向恢复任务的OS_TCB .page .text _OSCtxSw: .ref _OSTCBHighRdy .ref _OSTCBCur .ref _OSPrioHighRdy .ref _OSPrioCur .global _OSCtxSw PUSH RPC MOVW DP,#_OSTCBCur ; OSTCBCur->OSTCBStkPtr = SP MOVL XAR4,@_OSTCBCur ; |274| MOV AL,SP MOV *+XAR4[0],AL ; |274| MOVW DP,#_OSTCBHighRdy ; oSTCBCur = OSTCBHighRdy MOVL ACC,@_OSTCBHighRdy MOVW DP,#_OSTCBCur MOVL @_OSTCBCur,ACC MOVW DP,#_OSPrioHighRdy ;OSPrioCur = OSPrioHighRdy MOV AL,@_OSPrioHighRdy MOVW DP,#_OSPrioCur MOV @_OSPrioCur,AL MOVW DP,#_OSTCBHighRdy ;SP = OSTCBhighRdy->OSTCBStkPt MOVL XAR4,@_OSTCBHighRdy MOV AL,*+XAR4[0] MOV @SP,AL POP RPC IRET .end (4)中断结束任务切换函数定义 该函数为中断退出时的入口,其功能包括: ◆调用OSTaskSwHook(); ◆设置OSPrioCur=OSPrioHighRdy; ◆设置OSTCBCur =OSTCBHighRdy; ◆设置SP=OSTCBHighRdy->OSTCBStkPtr; ◆从新TASK的堆栈恢复新TASK的上下文 ◆执行新的TASK ◆其中OSTCBCur指向挂起任务的OS_TCB ◆OSTCBHighRdy指向恢复任务的OS_TCB .page .text _OSIntCtxSw: .ref _OSTCBHighRdy .ref _OSTCBCur .ref _OSPrioHighRdy .ref _OSPrioCur .global _OSIntCtxSw ;模拟返回中断 ;保存当前环境 SUBB SP,#4 MOVW DP,#_OSTCBCur ; OSTCBCur->OSTCBStkPtr = SP MOVL XAR4,@_OSTCBCur ; |274| MOV AL,SP MOV *+XAR4[0],AL ; |274| MOVW DP,#_OSTCBHighRdy ; oSTCBCur = OSTCBHighRdy MOVL ACC,@_OSTCBHighRdy MOVW DP,#_OSTCBCur MOVL @_OSTCBCur,ACC MOVW DP,#_OSPrioHighRdy ;OSPrioCur = OSPrioHighRdy MOV AL,@_OSPrioHighRdy MOVW DP,#_OSPrioCur MOV @_OSPrioCur,AL MOVW DP,#_OSTCBHighRdy ;SP = OSTCBhighRdy->OSTCBStkPtr MOVL XAR4,@_OSTCBHighRdy MOV AL,*+XAR4[0] MOV @SP,AL |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| uC/OS-II在ADSP-21535上的实… |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|