当前位置: 代码迷 >> 单片机 >> uC/OS-II移植到瑞萨SH2A平台详解及源代码,欢迎交流,该怎么处理
  详细解决方案

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

热度:213   发布时间:2016-04-28 16:34:05.0
uC/OS-II移植到瑞萨SH2A平台详解及源代码,欢迎交流
刚移植好的。
因为不能上传附件
大家可邮箱咨询我
我可以把工程包发给你们。


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



---------------------------------------------------------------------------
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  
  相关解决方案