版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36195711/article/details/88252798
不使用集成编译器,所有的编译想在linux环境下完成
首先获取ucos源码,进行常规的修改,即移植主要涉及的文件
1.设置与处理器相关的代码 OS_CPU.H
typedef unsigned char BOOLEAN; /* 布尔变量 */
typedef unsigned char INT8U; /* 无符号8位整型变量 */
typedef signed char INT8S; /* 有符号8位整型变量 */
typedef unsigned short INT16U; /* 无符号16位整型变量 */
typedef signed short INT16S; /* 有符号16位整型变量 */
typedef unsigned int INT32U; /* 无符号32位整型变量 */
typedef signed int INT32S; /* 有符号32位整型变量 */
typedef float FP32; /* 单精度浮点数(32位长度) */
typedef double FP64; /* 双精度浮点数(64位长度) */
typedef INT32U OS_STK; /* 堆栈是32位宽度 */
/* 以下是兼容UC/OS V1.XX的数据类型,在uC/OS-II没有使用 */
#define BYTE INT8S
#define UBYTE INT8U
#define WORD INT16S
#define UWORD INT16U
#define LONG INT32S
#define ULONG INT32U
typedef INT32U OS_CPU_SR;
ucos需要先关中断再访问临界区的代码,并在访问完成后重新允许中断,ucos定义了两个宏来禁止和允许中断,这两个宏需要我们自己来实现
#define OS_ENTER_CRITICAL() (cpu_sr = OSCPUSaveSR()) /* Disable interrupts */
#define OS_EXIT_CRITICAL() (OSCPURestoreSR(cpu_sr)) /* Restore interrupts */
声明这两个函数
OS_CPU_SR OSCPUSaveSR(void);
void OSCPURestoreSR(OS_CPU_SR cpu_sr);
在OS_CPU_A.S中来实现
.global OSCPUSaveSR
OSCPUSaveSR:
mrs r0,CPSR
orr r1,r0,#0xc0
msr CPSR_c,r1
bx lr
.global OSCPURestoreSR
OSCPURestoreSR:
msr CPSR_c,r0
bx lr
2.用C语言实现与处理器任务相关的函数,在OS_CPU_C.C中实现,主要是实现一个系统的堆栈初始化函数
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;
opt = opt; /* 'opt' is not used, prevent warning */
stk = ptos; /* Load stack pointer */
*(stk) = (OS_STK)task; /* Entry Point */
*(--stk) = (INT32U)0; /* lr */
*(--stk) = (INT32U)0; /* r12 */
*(--stk) = (INT32U)0; /* r11 */
*(--stk) = (INT32U)0; /* r10 */
*(--stk) = (INT32U)0; /* r9 */
*(--stk) = (INT32U)0; /* r8 */
*(--stk) = (INT32U)0; /* r7 */
*(--stk) = (INT32U)0; /* r6 */
*(--stk) = (INT32U)0; /* r5 */
*(--stk) = (INT32U)0; /* r4 */
*(--stk) = (INT32U)0; /* r3 */
*(--stk) = (INT32U)0; /* r2 */
*(--stk) = (INT32U)0; /* r1 */
*(--stk) = (INT32U)pdata; /* r0 : argument */
#ifdef THUMB_TASKS
*(--stk) = (INT32U)(SVCMODE|TBIT); /* PSR */
#else
*(--stk) = (INT32U)(SVCMODE|0x0); /* PSR */
#endif
*(--stk) = (INT32U)(SVCMODE|0x0); /* SPSR */
return (stk);
}
和一些钩子函数,如果用不到的话,可以定义成空函数
3.处理器相关部分的汇编实现,需要编写的函数如下
OSStartHighRdy()
OSCtxSw()
OSTickISR()
具体的汇编代码就不贴了,以后拿出来研究