刚移植好的。
因为不能上传附件
大家可邮箱咨询我
我可以把工程包发给你们。
以下为移植说明.....
---------------------------------------------------------------------------
AUTHOR: 邱庆康
DATE: 2008-8-26
UPDATE: 2008-8-28
E-mail: [email protected] 欢迎交流
---------------------------------------------------------------------------
系统配置:
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