1、ucosii移植实验报告一、实验目的了解uC/OS-II内核的主要结构。掌握将uC/OS-II内核移植到Cortex-M3处理器上的基本方法。二、实验环境与设备硬件:Cortex-M3嵌入式开发平台、用于Cortex-M3的JTAG仿真器或者内嵌的JTAG仿真器、PC机Pentium100以上。软件:PC机操作系统win98、Win2000或WinXP、Keil for ARM或IAR for ARM集成开发环境、仿真器驱动程序、超级终端通讯程序等。三、预备知识掌握在Keil for ARM或IAR for ARM集成开发环境中编写和调试程序的基本过程。了解Cortex-M3处理器的结构。理解
2、uC/OS-II系统结构。四、实验内容将uC/OS-II内核移植到Cortex-M3微处理器上。编写两个简单任务,在超级终端上观察两个任务的切换。五、流程图六、实验代码修改后的Os_cpu.h#ifndef OS_CPU_H#define OS_CPU_H#ifdef OS_CPU_GLOBALS#define OS_CPU_EXT#else#define OS_CPU_EXT extern#endiftypedef unsigned char BOOLEAN;typedef unsigned char INT8U; /* Unsigned 8 bit quantity*/typedef si
3、gned char INT8S; /* Signed 8 bit quantity */typedef unsigned short INT16U; /* Unsigned 16 bit quantity*/typedef signed short INT16S; /* Signed 16 bit quantity */typedef unsigned int INT32U; /* Unsigned 32 bit quantity */typedef signed int INT32S; /* Signed 32 bit quantity */typedef float FP32; /* Si
4、ngle precision floating point*/typedef double FP64; /* Double precision floating point */typedef unsigned int OS_STK; /* Each stack entry is 32-bit wide */typedef unsigned int OS_CPU_SR; /* Define size of CPU status register (PSR = 32 bits) */#define OS_CRITICAL_METHOD 3u#if OS_CRITICAL_METHOD = 3u#
5、define OS_ENTER_CRITICAL() cpu_sr = OS_CPU_SR_Save();#define OS_EXIT_CRITICAL() OS_CPU_SR_Restore(cpu_sr);#endif#define OS_STK_GROWTH 1u /* Stack grows from HIGH to LOW memory on ARM */#define OS_TASK_SW() OSCtxSw()#if OS_CRITICAL_METHOD = 3u /* See OS_CPU_A.ASM */OS_CPU_SR OS_CPU_SR_Save(void);void
6、 OS_CPU_SR_Restore(OS_CPU_SR cpu_sr);#endifvoid OSCtxSw(void);void OSIntCtxSw(void);void OSStartHighRdy(void);void OSPendSV(void);#endif修改后的Os_cpu_c.c#define OS_CPU_GLOBALS#include #include #if OS_TMR_EN 0ustatic INT16U OSTmrCtr;#endif#if OS_CPU_HOOKS_EN 0uvoid OSInitHookBegin (void) #if OS_TMR_EN 0
7、u OSTmrCtr = 0u;#endif#endif#if OS_CPU_HOOKS_EN 0uvoid OSInitHookEnd (void)#endif#if OS_CPU_HOOKS_EN 0uvoid OSTaskCreateHook (OS_TCB *ptcb)#if OS_APP_HOOKS_EN 0u App_TaskCreateHook(ptcb);#else (void)ptcb; /* Prevent compiler warning */#endif#endif#if OS_CPU_HOOKS_EN 0uvoid OSTaskDelHook (OS_TCB *ptc
8、b)#if OS_APP_HOOKS_EN 0u App_TaskDelHook(ptcb);#else (void)ptcb; /* Prevent compiler warning */#endif#endif#if OS_CPU_HOOKS_EN 0uvoid OSTaskIdleHook (void)#if OS_APP_HOOKS_EN 0u App_TaskIdleHook();#endif#endif#if OS_CPU_HOOKS_EN 0uvoid OSTaskStatHook (void)#if OS_APP_HOOKS_EN 0u App_TaskStatHook();#
9、endif#endifOS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt) OS_STK *stk; (void)opt; /* opt is not used, prevent warning*/ stk = ptos; /* Load stack pointer */ /* Registers stacked as if auto-saved on exception */ *(stk) = (INT32U)0x01000000uL; /* xPSR */ *(-st
10、k)= (INT32U)task; /* Entry Point */ *(-stk)= (INT32U)0xFFFFFFFEL; /* R14 (LR) (init value will */ /* cause fault if ever used) */ *(-stk)= (INT32U)0x12121212uL;/* R12*/ *(-stk)= (INT32U)0x03030303uL; /* R3 */ *(-stk)= (INT32U)0x02020202uL /* R2 */ *(-stk)=(INT32U)0x01010101uL; /* R1 */ *(-stk)=(INT3
11、2U)p_arg; /* R0 : argument */ /* Remaining registers saved on process stack */ *(-stk)=(INT32U)0x11111111uL; /* R11 */ *(-stk)=(INT32U)0x10101010uL; /* R10 */ *(-stk)=(INT32U)0x09090909uL; /* R9 */ *(-stk)=(INT32U)0x08080808uL; /* R8 */ *(-stk)=(INT32U)0x07070707uL; /* R7 */ *(-stk)=(INT32U)0x060606
12、06uL; /* R6 */ *(-stk)=(INT32U)0x05050505uL; /* R5 */ *(-stk)=(INT32U)0x04040404uL; /* R4 */ return (stk);#if (OS_CPU_HOOKS_EN 0u) & (OS_TASK_SW_HOOK_EN 0u)void OSTaskSwHook (void)#if OS_APP_HOOKS_EN 0u App_TaskSwHook();#endif#endif#if OS_CPU_HOOKS_EN 0uvoid OSTCBInitHook (OS_TCB *ptcb)#if OS_APP_HO
13、OKS_EN 0u App_TCBInitHook(ptcb);#else (void)ptcb; /* Prevent compiler warning */#endif#endif#if (OS_CPU_HOOKS_EN 0u) & (OS_TIME_TICK_HOOK_EN 0u)void OSTimeTickHook (void)#if OS_APP_HOOKS_EN 0u App_TimeTickHook();#endif #if OS_TMR_EN 0u OSTmrCtr+; if (OSTmrCtr = (OS_TICKS_PER_SEC / OS_TMR_CFG_TICKS_P
14、ER_SEC) OSTmrCtr = 0; OSTmrSignal(); #endif#endif修改后的Os_cpu_a.asm EXTERN OSRunning EXTERN OSPrioCur EXTERN OSPrioHighRdy EXTERN OSTCBCur EXTERN OSTCBHighRdy EXTERN OSIntExit EXTERN OSTaskSwHookEXPORT OS_CPU_SR_Save EXPORT OS_CPU_SR_Restore EXPORT OSStartHighRdy EXPORT OSCtxSw EXPORT OSIntCtxSw EXPOR
15、T OSPendSVNVIC_INT_CTRL EQU 0xE000ED04; Interrupt control state register.NVIC_SYSPRI14 EQU 0xE000ED22 System priority register (priority 14).NVIC_PENDSV_PRI EQU 0xFF; PendSV priority value (lowest).NVIC_PENDSVSET EQU 0x10000000; Value to trigger PendSV exception.PRESERVE8 ;The AAPCS requires that th
16、e stack-pointer be 8-byte aligned on entry to a conforming function. AREA UCOSII_ASM, CODE, READONLY THUMBOS_CPU_SR_Save MRS R0, PRIMASK ; Set prio int mask to mask all (except faults) CPSID I BX LROS_CPU_SR_Restore MSR PRIMASK, R0 BX LR OSStartHighRdy LDR R0, =NVIC_SYSPRI14; Set the PendSV exceptio
17、n priority LDR R1, =NVIC_PENDSV_PRI STRB R1, R0 MOV R0, #; Set the PSP to 0 for initial context switch call MSR PSP, R0 LDR R0, =OSRunning ; OSRunning = TRUE MOV R1, #1 STRB R1, R0 LDR R0, =NVIC_INT_CTRL; Trigger the PendSV exception (causes context switch) LDR R1, =NVIC_PENDSVSET STR R1, R0 CPSIE I
18、 ; Enable interrupts at processor levelOSStartHang B OSStartHang; Should never get hereOSCtxSw LDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch) LDR R1, =NVIC_PENDSVSET STR R1, R0 BX LROSIntCtxSw LDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch
19、) LDR R1, =NVIC_PENDSVSET STR R1, R0 BX LROSPendSV CPSID I ; Prevent interruption during context switch MRS R0, PSP ; PSP is process stack pointer CBZ R0, OSPendSV_nosave ; Skip register save the first time SUB R0, R0, #0x20 ; Save remaining regs r4-11 on process stack STM R0, R4-R11 LDR R1, =OSTCBC
20、ur ; OSTCBCur-OSTCBStkPtr = SP; LDR R1, R1 STR R0, R1 ; R0 is SP of process being switched out; At this point, entire context of process has been savedOSPendSV_nosave PUSH R14 ; Save LR exc_return value LDR R0, =OSTaskSwHook; OSTaskSwHook(); BLX R0 POP R14 LDR R0, =OSPrioCur ; OSPrioCur = OSPrioHigh
21、Rdy; LDR R1, =OSPrioHighRdy LDRB R2, R1 STRB R2, R0 LDR R0, =OSTCBCur ; OSTCBCur = OSTCBHighRdy; LDR R1, =OSTCBHighRdy LDR R2, R1 STR R2, R0 LDR R0, R2 ; R0 is new process SP; SP = OSTCBHighRdy-OSTCBStkPtr; LDM R0, R4-R11; Restore r4-11 from new process stack ADDS R0, R0, #0x20 MSR PSP, R0; Load PSP
22、 with new process SP ORR LR, LR, #0x04 Ensure exception return uses process stack CPSIE I BX LR ; Exception return will restore remaining contextALIG主函数APP.C#include#include utils/uartstdio.h#include lwip/sys.h #define TASK1_PRIO 11#define TASK2_PRIO 3#define task1stck 1024#define task2stck 1024#inc
23、lude systemInit.h#define LED_PERIPH SYSCTL_PERIPH_GPIOF#define LED_PORT GPIO_PORTF_BASE#define LED_PIN GPIO_PIN_2 #define LED_PINN GPIO_PIN_3 void LED0_stack(void *p_arg) /jtagWait( ); clockInit( ); SysCtlPeriEnable(LED_PERIPH); GPIOPinTypeOut(LED_PORT, LED_PIN); for (;) GPIOPinWrite(LED_PORT, LED_P
24、IN, 0x00); OSTimeDly(OS_TICKS_PER_SEC / 4); GPIOPinWrite(LED_PORT, LED_PIN, 0xFF); OSTimeDly(OS_TICKS_PER_SEC / 4); void LED1_stack(void *p_arg) /jtagWait( ); clockInit( ); SysCtlPeriEnable(LED_PERIPH); GPIOPinTypeOut(LED_PORT, LED_PINN); for (;) GPIOPinWrite(LED_PORT, LED_PINN, 0x00); OSTimeDly(OS_
25、TICKS_PER_SEC / 4);z GPIOPinWrite(LED_PORT, LED_PINN, 0xFF); OSTimeDly(OS_TICKS_PER_SEC / 4); static void App_TaskStart (void *p_arg); int main (void) BSP_PreInit (); BSP_IntDisAll(); OSInit(); OSTaskCreateExt(void (*)(void *) App_TaskStart, (void *) 0, (OS_STK *)&App_TaskStartStkAPP_CFG_TASK_START_
26、STK_SIZE - 1, (INT8U ) APP_CFG_TASK_START_PRIO, (INT16U ) APP_CFG_TASK_START_PRIO, (OS_STK *)&App_TaskStartStk0, (INT32U ) APP_CFG_TASK_START_STK_SIZE, (void *) 0, (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); OSTaskCreate(LED0_stack,(void *)0, &App_TaskStartStk1 APP_CFG_TASK_START_STK_SIZE
27、-1,0); OSTaskCreate(LED1_stack,(void *)0, &App_TaskStartStk2 APP_CFG_TASK_START_STK_SIZE -1,1); OSStart(); /4 os startstatic void App_TaskStart (void *p_arg) (void)p_arg; BSP_PostInit(); Tmr_TickInit (); #if (OS_TASK_STAT_EN 0) OSStatInit(); #endif for(;) OSTimeDlyHMSM(0, 0, 2, 0); UARTprintf(0332JI am task1n);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1