uC/OS-II移植到瑞萨SH2A平台详解及源代码,欢迎交流

newlife_qqk 2008-08-28 08:23:02
加精
刚移植好的。
因为不能上传附件
大家可邮箱咨询我
我可以把工程包发给你们。


以下为移植说明.....



---------------------------------------------------------------------------------------------------------------
AUTHOR: 邱庆康
DATE: 2008-8-26
UPDATE: 2008-8-28
E-mail: qqk_qqk@163.com 欢迎交流
---------------------------------------------------------------------------------------------------------------


系统配置:
IDE: HEW SuperH 9.1.1.0 for SH2A-FPU
CPU: Renesas SH2A/7261
OS: uC/OS-II 2.51
Memory: 64M SDRAM
Emluator: E10A-USB


本机系统时钟根据CPU定时器T0来配置,默认为每秒溢出20次,也就是每秒产生20个时钟节拍。


CPU说明:
SH7261属于SH2A系列微处理器,32位RISC,采用哈佛体系结构,5级流水线,内部包含一个高速缓存,一个浮点协处理器和16个用于快速中断响应的Register Bank。
内部最高时钟频率为120MHz , 总线频率为60MHz
寄存器包括:通用寄存器,系统寄存器,控制寄存器和浮点寄存器。本机未做浮点运算,故浮点寄存器将不作考虑。


uC/OS-II说明:
该实时操作系统内核为2.51版本。可由用户运行56个任务。具体功能参见《uC/OS-II》。


移植步骤:
1.建立编译环境。
本系统将映像文件下载到SDRAM中进行调试。需要修改section段,并使用SH系列的命令行语句初始化总线控制器,以便将程序下载到SDRAM相应的map映像区。

2.修改中断向量表。
本系统使用向量号为32的陷阱指令来进行任务切换,需要在中断向量表INT_Vectors中将INT_TRAPA32替换为OSCtxSw。另外,系统时钟使用8位定时器T0溢出中断,故需要将中断向量表中的INT_TMR0_OVI0替换为OSTickISR。

3.硬件初始化
在hwsetup.c文件中初始化时钟,总线控制器,定时器,Cache等CPU及片上I/O资源,以便为uC/OS-II建立运行环境。

4.编写os_cpu_c.c文件。
根据CPU的体系结构,模拟中断发生后的栈状态。
中断发生后,SR和PC先入栈。
task()中的参数默认传递到R0

如下:
// SH2A任务栈初始化
// 栈从高地址向低地址增长
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;

opt = opt;
stk = (OS_STK *)ptos;

*stk-- = 0; /* SR 任务启动后允许中断(interrupt mask bits set to 0) */
*stk-- = (OS_STK)task; /* PC */

*stk-- = 0xeeeeeeee; /* R14 */
*stk-- = 0xdddddddd; /* R13 */
*stk-- = 0xcccccccc; /* R12 */
*stk-- = 0xbbbbbbbb; /* R11 */
*stk-- = 0xaaaaaaaa; /* R10 */
*stk-- = 0x99999999; /* R9 */
*stk-- = 0x88888888; /* R8 */
*stk-- = 0x77777777; /* R7 */
*stk-- = 0x66666666; /* R6 */
*stk-- = 0x55555555; /* R5 */
*stk-- = 0x44444444; /* R4 */
*stk-- = 0x33333333; /* R3 */
*stk-- = 0x22222222; /* R2 */
*stk-- = 0x11111111; /* R1 */
*stk-- = (OS_STK)pdata; /* R0 */

*stk-- = 0x11000000; // GBR
*stk-- = 0x22000000; // MACH
*stk-- = 0x33000000; // MACL
*stk = 0x44000000; // PR

return ((OS_STK *)stk);
}



5.编写os_cpu.h文件。
开中断和关中断使用set_imask()函数
陷阱指令使用trapa()函数
以上两个函数包含在系统头文件machine.h中

另,还要申明用于os_cpu_a.src的四个汇编程序。为了防止Register Bank溢出,本系统将不使用Register Bank
如下:

#pragma interrupt OSCtxSw//(resbank) // SH2A执行陷阱指令时不使用Register Bank
extern void OSCtxSw(void); // 任务切换

#pragma interrupt OSTickISR//(resbank) // 该中断不使用Register Bank
extern void OSTickISR(void); // 定时器中断

extern void OSStartHighRdy(void); // 开始任务
extern void OSIntCtxSw(void); // 中断任务切换



6.编写os_cpu_a.src文件。

1) 压栈,出栈操作宏定义:
;R0 ~ Rn入栈
.MACRO PUSH Rn
MOVML.L \Rn,@-SPR ;将Rn~R0依入栈. R0入栈后,SP = SP-4
.ENDM

;R0 ~ Rn出栈
.MACRO POP Rn
MOVML.L @SPR+,\Rn ;该指令执行完时,也就是Rn出栈后,(SP = SP + 4)???
.ENDM

;保存系统和控制寄存器
.MACRO PUSH_REG
STC.L GBR,@-SPR ;将控制寄存器送入stack

STS.L MACH,@-SPR ;将系统寄存器送入stack
STS.L MACL,@-SPR
STS.L PR,@-SPR ;SP始终指向栈顶元素
.ENDM

;恢复系统和控制寄存器
.MACRO POP_REG
LDS.L @SPR+,PR ;恢复系统寄存器
LDS.L @SPR+,MACL
LDS.L @SPR+,MACH

LDC.L @SPR+,GBR ;恢复控制寄存器
.ENDM


2) OSStartHighRdy函数:
注意:子函数跳转指令JSR和中断返回指令RTE为delay branch指令,需要在后面插入一条单周期指令,以便在delay slot中填充CPU流水线。

;获得任务栈指针
MOV.L #_OSTCBHighRdy,R2
MOV.L @R2,R2
MOV.L @R2,SPR

POP_REG
POP R14

RTE
NOP


3) 任务切换OSCtxSw函数:
OSTaskSwHook函数可以不执行,以加快任务切换时间

PUSH R14
PUSH_REG

;保存当前任务SP
MOV.L #_OSTCBCur,R3
MOV.L @R3,R2
MOV.L SPR,@R2 ;保存当前任务栈指针SP到OSTCBCur首地址

;执行用户程序
MOV.L #_OSTaskSwHook,R4
JSR @R4
NOP

;OSPrioCur = OSPrioHighRdy
MOV.L #_OSPrioHighRdy,R0
MOV.B @R0,R0
MOV.L #_OSPrioCur,R1
MOV.B R0,@R1

;OSTCBCur = OSTCBHighRdy
MOV.L #_OSTCBHighRdy,R0
MOV.L @R0,R0
MOV.L #_OSTCBCur,R3
MOV.L R0,@R3

;恢复新任务的SP
MOV.L #_OSTCBHighRdy,R5
MOV.L @R5,R5
MOV.L @R5,SPR

POP_REG
POP R14

RTE
NOP


4) 中断级别的任务切换OSIntCtxSw:
OSTaskSwHook函数可不执行,以加快任务切换
注意栈顶的多余部分只有OSIntExit的返回地址,代码如下

;去掉栈顶多余单元
ADD #OFFSET,SPR ;NOTE!!!
;在HEW环境下,只有OSIntExit()的返回地址入栈
;OSIntCtxSw()的返回地址保存到PR
;系统函数set_imask(15)将SR的值送入Rn,而不是入栈

;保存当前SP
MOV.L #_OSTCBCur,R7
MOV.L @R7,R7
MOV.L SPR,@R7

;执行用户自定义程序
MOV.L #_OSTaskSwHook,R0
JSR @R0
NOP

;OSTCBCur = OSTCBHighRdy
MOV.L #_OSTCBHighRdy,R0
MOV.L @R0,R0
MOV.L #_OSTCBCur,R3
MOV.L R0,@R3

;OSPrioCur = OSPrioHighRdy
MOV.L #_OSPrioHighRdy,R2
MOV.B @R2,R2
MOV.L #_OSPrioCur,R3
MOV.B R2,@R3

;恢复新任务SP
MOV.L #_OSTCBHighRdy,R6
MOV.L @R6,R6
MOV.L @R6,SPR

POP_REG
POP R14

RTE
NOP


5) 系统时钟处理
定时器溢出标志位可清除也可不清除,反正T0就是一直计数-溢出-中断,不停循环

OSTickISR:

PUSH R14
PUSH_REG

;清除定时器溢出标志位
MOV.L #TCSR_0,R1
MOV.B @R1,R2
BCLR #5,R2
MOV.B R2,@R1

;进入中断,将嵌套数加1
MOV.L #_OSIntEnter,R5
JSR @R5
NOP

;时间节拍处理
MOV.L #_OSTimeTick,R5
JSR @R5
NOP

;中断退出处理
MOV.L #_OSIntExit,R5
JSR @R5
NOP

POP_REG
POP R14

RTE
NOP



7.main()函数测试任务切换
本系统运行三个简单的任务,分别点亮3个LED。
分别将各个任务调度上锁和开锁,并将任务延迟一定的时间。
三个任务之间都能精确的切换,并且优先级最高的任务一直在运行。
...全文
1843 65 打赏 收藏 转发到动态 举报
写回复
用AI写文章
65 条回复
切换为时间正序
请发表友善的回复…
发表回复
ymm198606 2012-06-13
  • 打赏
  • 举报
回复
顶一个;ymm198606@126.com
就是折腾啦 2011-12-08
  • 打赏
  • 举报
回复
顶一个 正做STM32嵌入式开发呢
卓小霖 2011-12-07
  • 打赏
  • 举报
回复
顶是必须的
叮当 2011-09-20
  • 打赏
  • 举报
回复
赞一个!
Elison062 2011-08-22
  • 打赏
  • 举报
回复
yangsen062@163.com 正在学习,能否发一份,谢谢!
skyvan 2011-07-22
  • 打赏
  • 举报
回复
大大好用心喔.
能否也分享給我.. 謝謝~

skyllerlin@gmail.com
大军阀Hi 2011-05-27
  • 打赏
  • 举报
回复
jqt419783454@163.com 谢谢!
大军阀Hi 2011-05-27
  • 打赏
  • 举报
回复
419783454@qq.com 谢谢!
yunshi905623 2011-03-09
  • 打赏
  • 举报
回复
zzc_nuaa@163.com我的邮箱,哥们,先谢过
miracledavid 2009-11-28
  • 打赏
  • 举报
回复
这篇文章我在瑞萨单片机论坛见过,楼主不厚道。原帖:www.renesas-mcu.com
anaisfromwuhan 2009-09-21
  • 打赏
  • 举报
回复
请发份给我呀,huzhangli@gmail.com,我们实验室也有这个板子
diy_diy 2009-07-15
  • 打赏
  • 举报
回复
楼主可以给我一份吗?我刚在搞瑞萨的SH7137,想参考一下,谢谢。我的邮箱是erita@163.com
phoex 2008-12-27
  • 打赏
  • 举报
回复
呵呵,抵制日货,选型是尽量不是小日本的器件!
newlife_qqk 2008-12-22
  • 打赏
  • 举报
回复
已经发了
注意查收
towli 2008-12-19
  • 打赏
  • 举报
回复
oil painting
oil painting
oil painting
oil painting
oil painting
oil-painting
Oilpainting
Oil paintings
modern art
painting
Oil paintings
3d painting
art painting
waterfall picture
oil canvas art
modern art
painting
Oil paintings
modern art
painting
Oil paintings
modern art
painting
oil painting artist
oil painting factory
oil painting supplier
handmade oil paintings
Hand painted oil paintings
wholesale oil paintings
oil painting for sale
oil painting history
original oil paintings
Drawing from nature
custom oil painting
Frame
photo frame
painting Frame
Oil painting Frame
Oil painting tracing
Oil painting reproductions
Famous painting
Famous painting reproduction
Portrait painting
portrait oil paintings
wholesale portrait oil paintings
Pet portrait
Pet portrait oil painting
linen canvas
Canvas painting
Canvas oil painting
Unframe painting
acrylic painting
knife painting
oil painting technique
Figure painting
Figure oil painting
Nude painting
Nude oil painting
Animal painting
Animal oil painting
Birds painting
Birds oil painting
Landscape painting
Landscape oil painting
Seascape painting
Seascape oil painting
Flower painting
Flower oil painting
Modern painting
Modern oil painting
group painting
group oil painting
group paintings
group oil paintings
Abstract painting
Abstract oil painting
Decoration painting
Decoration oil painting
Impression painting
Impression oil painting
classical painting
Classicalism painting
Classical oil painting
Reality painting
Reality oil painting
Still life painting
Still life oil painting
chinese oil painting
china oil painting
Xiamen oil painting
Dali
Monet
Van Gogh
Klimt
Picasso
Thomas
Canaletto
Bouguereau
Pino
Renoir
Miro
Botero
Lempica
Ingres
Leighton
Jack
Avian painting
Avian oil painting
Welcome warmly visit http://www.art-ych.com/
jjw18 2008-12-19
  • 打赏
  • 举报
回复
顶一下。
sdtshan 2008-12-19
  • 打赏
  • 举报
回复
不懂,帮顶
wap21 2008-12-19
  • 打赏
  • 举报
回复
不懂,帮顶
lsd1025 2008-12-19
  • 打赏
  • 举报
回复
楼主好牛!UP!
呵,呵,
qq1987316123 2008-12-19
  • 打赏
  • 举报
回复
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
加载更多回复(42)

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧