ucosii移植实验报告.docx_第1页
ucosii移植实验报告.docx_第2页
ucosii移植实验报告.docx_第3页
ucosii移植实验报告.docx_第4页
ucosii移植实验报告.docx_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、实验目的l 了解uC/OS-II内核的主要结构。l 掌握将uC/OS-II内核移植到Cortex-M3处理器上的基本方法。二、实验环境与设备l 硬件:Cortex-M3嵌入式开发平台、用于Cortex-M3的JTAG仿真器或者内嵌的JTAG仿真器、PC机Pentium100以上。l 软件:PC机操作系统win98、Win2000或WinXP、Keil for ARM或IAR for ARM集成开发环境、仿真器驱动程序、超级终端通讯程序等。三、预备知识l 掌握在Keil for ARM或IAR for ARM集成开发环境中编写和调试程序的基本过程。l 了解Cortex-M3处理器的结构。l 理解uC/OS-II系统结构。四、实验内容l 将uC/OS-II内核移植到Cortex-M3微处理器上。l 编写两个简单任务,在超级终端上观察两个任务的切换。五、流程图硬件初始化Ucosii系统初始化创建任务化操作系统启动LED闪烁六、实验代码修改后的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 signed 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; /* Single 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#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 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 0u 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 *ptcb)#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();#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 */ *(-stk)= (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)=(INT32U)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)0x06060606uL; /* 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_HOOKS_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_PER_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 EXPORT 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 the 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 exception 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 ; 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) 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, =OSTCBCur ; 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 = OSPrioHighRdy; 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 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#includelwip/sys.h #define TASK1_PRIO 11#define TASK2_PRIO 3#define task1stck 1024#define task2stck 1024#include 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_PIN, 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_TICKS_PER_SEC / 4);z GPIOPinWrite(LED_PORT, LED_PINN, 0xFF); OSTimeDly(OS_TICKS_PER_SEC / 4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论