4、基于uCOS-II操作系统的移植实验

合集下载

实操性最强:uCOS-II移植到STM32上的详细步骤;

实操性最强:uCOS-II移植到STM32上的详细步骤;

前言:说点废话,网上有很多关于uCOS-ii移植的文章,好多都是千篇一律,理论性很强,分析了一大堆虚头巴脑的东西,真想问他们,你确定你分析的这些东西是需要你做的工作吗?实操性严重欠缺。

这方面我也走了很多弯路,下面就将自己的移植过程一步步的记录下来,也给大家做做参考。

首先,简单总结一下移植的大概过程:(1)去uC/OS-ii官网下载你要移植芯片CPU的相关案例,不一定完全对应,那就找相应系列吧。

(2)编程环境一般有两种,分别是IAR和MDK,这个根据你自己的编程环境进行下载。

(3)本案例需要将uC/OS-II 移植到STM32F103ZET6上,而我使用的编程环境是MDK,很遗憾,官网上提供的案例是基于IAR的,所以要基于IAR的案例进行更改。

(4)使用MDK创建一个无操作系统的最简单程序,确保这个程序能够使用,这样做的目的是为了一步步的排查错误,假如无操作系统时,都有错误,移植过程中也肯定会有编译错误,那么在排查错误的时候也就增加了难度,不会写物操作系统的简单程序怎么办。

那就不要往下看了。

(5)移植的最大的改动主要有两部分,一个是一些头文件的增减,另外一个就是向量表中PendSV_Handler和SysTick_Handler的修改。

这里我要吐槽一下,网上说了一大堆关于什么OS_CPU.H的更改还有各种函数的的分析,这都是扯淡。

这些根本就不用移植者去修改,官网提供的案例都已经提供了,除非你选择移植的CPU是比较偏的,那么这些东西需要移植者自己去编写。

好了,下面就开始详细的记录怎么去移植。

一、创建一个无操作系统的简单裸板系统1.创建源文件工程文件夹,如下图所示:其中文件夹“CMSIS”为内核的接口,包含的文件如下图文件夹STM32_StdPeriph为固件驱动文件夹,这个把STM32的固件全都添加进去即可。

文件夹User为其他文件,如下图所示:文件夹Output和List主要是放那些编译产生的乱七八糟的文件,为了使工程代码更加简洁。

uC-OS-II实时操作系统在嵌入式平台上进行移植的一般方法和技巧

uC-OS-II实时操作系统在嵌入式平台上进行移植的一般方法和技巧

uC/OS-II实时操作系统在嵌入式平台上进行移植的一般方法和技巧引言---实时操作系统的使用,能够简化嵌入式系统的应用开发,有效地确保稳定性和可靠性,便于维护和二次开发。

μC/OS-II是一个基于抢占式的实时多任务内核,可固化、可剪裁、具有高稳定性和可靠性,除此以外,μC/OS-II的鲜明特点就是源码公开,便于移植和维护。

在μC/OS-II官方的主页上可以查找到一个比较全面的移植范例列表。

但是,在实际的开发项目中,仍然没有针对项目所采用芯片或开发工具的合适版本。

那么,不妨自己根据需要进行移植。

本文则以在TMS320C6711DSP上的移植过程为例,分析了μC/OS-II在嵌入式开发平台上进行移植的一般方法和技巧。

μC/OS-II移植的基本步骤在选定了系统平台和开发工具之后,进行μC/OS-II的移植工作,一般需要遵循以下的几个步骤:●深入了解所采用的系统核心●分析所采用的C语言开发工具的特点●编写移植代码●进行移植的测试●针对项目的开发平台,封装服务函数(类似80x86版本的PC.C和PC.H)系统核心无论项目所采用的系统核心是MCU、DSP、MPU,进行μC/OS-II的移植时,所需要关注的细节都是相近的。

首先,是芯片的中断处理机制,如何开启、屏蔽中断,可否保存前一次中断状态等。

还有,芯片是否有软中断或是陷阱指令,又是如何触发的。

此外,还需关注系统对于存储器的使用机制,诸如内存的地址空间,堆栈的增长方向,有无批量压栈的指令等。

在本例中,使用的是TMS320C6711DSP。

这是TI公司6000系列中的一款浮点型号,由于其时钟频率非常高,且采用了超常指令字(VLIW)结构、类RISC指令集、多级流水等技术,所以运算性能相当强大,在通信设备、图像处理、医疗仪器等方面都有着广泛的应用。

在C6711中,中断有3种类型,即复位、不可屏蔽中断(NMI)和可屏蔽中断(INT4-INT15)。

可屏蔽中断由CSR寄存器控制全局使能,此外也可用IER寄存器分别置位使能。

uCOSII的内核移植

uCOSII的内核移植

河海大学计算机及信息工程学院(常州)课程设计报告题目uCOSII的内核移植专业、学号0962910212 电科学生姓名葛彦源指导教师金纪东完成时间2012年6月20嵌入式系统是当今非常热门的研究领域,早期多以单片机为核心,应用领域非常广泛.但单片机系统功能比较简单,速度较慢,难以适应现代技术的快速发展.随着现场可编程逻辑阵列技术的日益成熟,基于片上可编程系统的嵌入式处理器越来越多地受到人们的关注.特别是Altera公司推出的Nios II嵌入式处理器软核,通过软件编程的方法可灵活地实现嵌入式的功能,并且针对进行性能优化,可大大提高系统性能.它还具有片上调试功能,便于系统的设计和调试.随着芯片技术的发展,SOPC成为嵌入式系统设计的一个发展趋势,不同于桌面操作系统,嵌入式操作系统需根据特定的嵌入式应用及不同的处理器而进行移植和裁剪。

本次课设主要研究了嵌入式操作系统中应用较为广泛的、源代码开放的UCOSII在基于目前应用非常广泛的ARM7处理器体系结构上的移植,并在此基础上实现了简单的多任务应用程序的操作。

摘要 (2)一课程设计 (4)1.1课程设计目标及其预期效果 (4)1.2实现方法 (4)二系统设计 (5)2.1UCOSII操作系统的简介 (5)2.2S3C44B0X简介 (5)2.3UCOSII的内核结构 (6)2.4可移植性分析 (7)三实验结果及分析 (8)3.1UCOSII移植及测试 (8)3.1.1移植过程 (8)3.1.2测试过程 (9)3.2UCOSII测试结果 (9)3.2.1建立工程 (9)3.2.2 ADS1.2下仿真、调试 (10)四实验结论 (12)心得体会 (12)参考文献 (13)附录 (13)一课程设计1.1课程设计目标及其预期效果1. 移植UCOSII到三星的S3C44B0X(或者LPC210X )ARM7TDMI处理器上2.编写多任务应用程序:一个熄灭D7、D8灯的任务,一个点亮D7熄灭D8的任务,一个熄灭D7点亮D8的任务,三个任务轮流输出。

ucos_II移植总结

ucos_II移植总结

Ucos_II移植总结:之前已经基本算是成功的移植过ucos-II(内存管理部分没有处理),但是由于可恶的硬盘故障,让我的劳动成果付诸东流。

其间的一些移植经验没有及时总结,现在想来颇有点从头再来的悲壮!鉴于之前的教训,这次,边移植边总结,以防重蹈覆辙。

还好之前的移植过程已经解决了部分棘手的难题,现在复现一下权当是复习一下arm和ucos_II了。

这次的移植还是基于SEP4020芯片,其中的一些引导代码和中断处理代码还是照搬已经写好的代码吧,现在已经没有自己动手写的激情了!下面按照自己的移植步骤一步步总结吧:第一步:创建工程,将基本的启动代码照搬过来,建立一个最小系统,能够在开发板上运行成功。

第二步:将ucos-II源代码copy过来。

第三步:对基本的语法错误进行改正。

对工程进行编译,根据提示进行基本语法的改正。

主要包括:INCLUDES.h中头文件的调用第四步:对需要自己手动编写的函数首先要清空,防止编译报错,然后一步步手动编写代码。

1、临界段代码:os_cpu.h中OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()两个宏重新定义为我们自己写的开关中断函数。

Os_cpu_a.s文件添加如下代码:AREA MCUINIT , CODE, READONLYENTRY;/* 开启IRQ中断*/;voidEnableInterrupt(void);{EXPORT EnableInterruptEnableInterruptmrs r0,CPSRbic r0, r0, #0x80 ;set bit7 to 0msr CPSR_cxsf,r0movpc,lr ;Return to caller;};/* 关闭IRQ中断*/;voidDisableInterrupt(void);{EXPORT DisableInterruptDisableInterruptmrs r0,CPSRorr r0, r0, #0x80 ;set bit7 to 1msr CPSR_cxsf,r0movpc,lr ;Return to caller;}END2、OS_CPU_A.S文件代码编写AREA MCUINIT , CODE, READONLYENTRY;/* 开启IRQ中断*/;voidEnableInterrupt(void);{EXPORT EnableInterruptEnableInterruptmrs r0,CPSRbic r0, r0, #0x80 ;set bit7 to 0msr CPSR_cxsf,r0movpc,lr ;Return to caller;};/* 关闭IRQ中断*/;voidDisableInterrupt(void);{EXPORT DisableInterruptDisableInterruptmrs r0,CPSRorr r0, r0, #0x80 ;set bit7 to 1msr CPSR_cxsf,r0movpc,lr ;Return to caller;};任务切换代码OSCTXSWEXPORT OS_TASK_SW_ARMOS_TASK_SW_ARMSTMFD sp!, {lr} ; save pcSTMFD sp!, {lr} ; save lrMRS r14, SPSRSTMFD sp!, {r14} ; save current PSRSTMFD sp!, {r0-r12} ; save register file and ret address ;; OSPrioCur = OSPrioHighRdyIMPORT OSPrioCurIMPORT OSPrioHighRdyLDR r4, =OSPrioCurLDR r5, =OSPrioHighRdyLDRB r6, [r5]STRB r6, [r4]; Get current task TCB addressIMPORT OSTCBCurLDR r4, =OSTCBCurLDR r5, [r4]STR sp, [r5] ; store sp in preempted taskss TCB; Get highest priority task TCB addressIMPORT OSTCBHighRdyLDR r6, =OSTCBHighRdyLDR r6, [r6]LDR sp, [r6] ; get new tasks stack pointer; OSTCBCur = OSTCBHighRdySTR r6, [r4] ; set new current task TCB address;LDMFD sp!, {r0-r12} ; YYY+LDMFD sp!, {r14} ; YYY+; LDR r14, =0x000000D3MSR CPSR_cxsf, r14 ; YYY+;调试时屏掉此句才会跑的通,待解决LDMFD sp!, {lr,pc} ; YYY+;OS启动时开始运行创建的最高优先级任务; void OSStartHighRdy(void); ; Start the task with the highest priority;;EXPORT OSStartHighRdyOSStartHighRdyIMPORT OSTCBCurIMPORT OSTCBHighRdyIMPORT OSRunningLDR r4, =OSTCBCur ; Get current task TCB addressLDR r5, =OSTCBHighRdy ; Get highest priority task TCB addressLDR r5, [r5] ; get stack pointerLDR sp, [r5] ; switch to the new stackSTR r5, [r4] ; set new current task TCB address;OSRunning = 1 'TURE'LDR r4, =0x01 ; Get current task TCB addressLDR r5, =OSRunning ; Get highest priority task TCB addressSTRB r4, [r5];LDMFD sp!, {r0-r12} ; start the new taskLDMFD sp!, {r14} ; get new state from top of the stackMSR CPSR_cxsf, r14 ; CPSR should be SVC32ModeLDMFD sp!, {lr,pc};中断级任务切换EXPORT OSIntCtxSwOSIntCtxSwIMPORT OSTCBCurIMPORT OSPrioCurIMPORT OSTCBHighRdyIMPORT OSPrioHighRdyIMPORT OSTaskSwHookBL OSTaskSwHook;OSTCBCur = OSTCBHighRdyLDR r4, =OSTCBCurLDR r5, =OSTCBHighRdyLDR r6, [r5]STR r6, [r4];OSPrioCur = OSPrioHighRdyLDR r4, =OSPrioCurLDR r5, =OSPrioHighRdyLDRB r6, [r5]STRB r6, [r4];sp = OSTCBHighRdy->OSTCBStkPtrLDR r6, =OSTCBHighRdyLDR r6, [r6]LDR sp, [r6] ; get new tasks stack pointerLDMFD sp!,{r0, r1};在timedly中断服务程序中,函数开始压栈两个寄存器,为保证堆栈中数据一致,需出栈对齐;resume registersLDMFD sp!, {r0-r12} ; start the new taskLDMFD sp!, {r14} ; get new state from top of the stack; LDR r14, =0x000000D3MSR CPSR_cxsf, r14 ; CPSR SVC32Mode调试时屏掉此句才会跑的通,待解决LDMFD sp!, {lr,pc}END中断服务程序代码IRQ_DOstmfd sp!, {r0,r1}ldr r0, =IRQ_R1str r1, [r0]ldmfd sp!, {r0}ldr r1, =IRQ_R0str r0, [r1] ;保存R0和R1寄存器(因为这两个寄存器再后面要用到)add r13, r13, #4 ;restore the sp_irq top to original irq topsub r14, r14, #4mov r0, r14 ;LR_irq(R14)减4并保存在R0mrs r1, spsrorr r1, r1, #0x80 ;将SPSR_irq的中断屏蔽位置‘1’(屏蔽中断),并保存再R1 中msr cpsr_cxsf, r1 ;将模式切换到中断前的模式;---------------------------------------------------------------------------------------------bic r1, r1, #0x80 ;将原先保存的SPSR_irq的R1的中断屏蔽位清零(允许中断)stmfd sp!, {r0}stmfd sp!, {r14}stmfd sp!, {r1} ;依次将R0,R14,R1的值压入中断前模式下的堆栈(当前R0,R14,R1中存放的分别是LR_irq-4,中断前模式下的LR,SPSR_irq)ldr r0, =IRQ_R1ldr r1, [r0]stmfd sp!, {r1}ldr r1, =IRQ_R0ldr r0, [r1]stmfd sp!, {r0}ldmfd sp!, {r0,r1} ;恢复原先保存的R0和R1stmfd sp!, {r0-r12} ;将r0--r12全部压入中断以前模式下的堆栈;; Get current task TCB addressIMPORT OSTCBCurLDR r4, =OSTCBCur;及时保存当前任务中断,因为可能会进行任务切换LDR r5, [r4]STR sp, [r5] ; store sp in preempted taskss TCB;-----------------------------IMPORT int_vector_handlerbl int_vector_handler ;跳转到中断源判断和中断处理程序;----------------------------- ;restore the registerldmfd sp!, {r0-r12} ;恢复原先保存的R0-R12ldmfd sp!, {r14}msr cpsr_cxsf, r14ldmfd sp!, {r14} ;将原先保存的SPSR_irq恢复到CPSR中ldmfd sp!, {pc}3、堆栈初始化函数OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt) {unsignedint *stk;opt = opt; /* 'opt' is not used, prevent warning */stk = (unsigned int *)ptos; /* Load stack pointer *//* build a context for the new task */*--stk = (unsigned int) task; /* pc */*--stk = (unsigned int) task; /* lr */*--stk = (0x60000053); /* cpsr IRQ, FIQ disable*/*--stk = 0; /* r12 */*--stk = 0; /* r11 */*--stk = 0; /* r10 */*--stk = 0; /* r9 */*--stk = 0; /* r8 */*--stk = 0; /* r7 */*--stk = 0; /* r6 */*--stk = 0; /* r5 */*--stk = 0; /* r4 */*--stk = 0; /* r3 */*--stk = 0; /* r2 */*--stk = 0; /* r1 */*--stk = (unsigned int) pdata; /* r0 */// *--stk = (0x0); /* spsr IRQ, FIQ disable */return ((void *)stk);}4、timertick函数void Timer_IRQ_Service1(void){U32 dummyread;U8 y;dummyread = *(RP)TIMER_T1ISCR;/* timerflag = 1;*///OSIntNesting = OSIntNesting + 1;clear_reg( TIMER_T1CR, 0);//关闭通道1中断OSTimeTick ();set_reg( TIMER_T1CR, 0);//使能通道1中断OS_ENTER_CRITICAL();if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Sched. only if all ISRs done & not locked */y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to HPT ready to run */OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);if (OSPrioHighRdy != OSPrioCur) { /* No CtxSw if current task is highest rdy */OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++; /* Increment context switch counter *///OS_TASK_SW(); /* Perform a context switch */OSIntCtxSw();}}OS_EXIT_CRITICAL();}第五步:对移植好的代码进行调试。

基于uCOS_II的以太网移植实例

基于uCOS_II的以太网移植实例

基于μC/OS_II的以太网移植实例目录第一章以太网移植准备工作 (2)1.1 硬件平台 (2)1.2 软件平台 (2)第二章以太网移植步骤 (4)2.1 文件结构以及文件说明 (4)2.2以太网文件移植 (5)2.3MDK中文件的导入 (5)2.4 程序中需要编辑的代码 (8)第三章以太网任务创建以及初始化流程 (11)3.1 以太网任务创建 (11)3.2 以太网初始化流程 (12)3.3 以太网数据收发流程 (12)第四章测试以太网连接以及任务间通信 (14)4.1Ping命令测试 (14)4.2 网络调试助手测试 (14)第一章以太网移植准备工作以移动基站的电表管理系统为背景,探讨基于μC/OS嵌入式系统的以太网移植方法。

移动基站电表管理系统终端的基本功能就是上位机通过以太网发送命令或数据给终端,终端收到后,再通过485通信对电表执行相应的动作,最后,终端把得到的信息处理后再次通过以太网上传回来。

这里重点是把以太网协议栈移植到程序中来,以创建一个以太网通信任务。

1.1 硬件平台硬件平台是主芯片为STM32F107VC的金牛开发板,开发板上已集成有以太网功能模块和RS485功能模块。

只是在开发板上RS-485与RS-232接口共用了微处理器的接收串口,需要设置JP4,且配置为1-2,如表1.1所示。

金牛开发板支持两种以太网接口模式,一种是MII接口模式,另一种是RMII接口模式。

这里选用MII接口模式,根据表1.2对跳线JP2、JP6、JP7、JP8、JP12进行相应的配置。

1.2 软件平台软件平台为RVMDK软件。

RVMDK是由ARM编译器RVCT与Keil的工程管理、调试仿真工具集成,RVMDK是业界最好的Cortex-M3开发工具之一,它拥有流畅的用户界面与强大的仿真功能,是一款非常强大的ARM微控制器开发工具。

移植前需要熟悉RVMDK软件的使用。

移植过程中需要用到如图1.1和图1.2所示文件,一个是基于μC/OS_II的移动基站电表管理系统终端程序,另一个是基于μC/OS_II系统以太网移植文件。

#uCOS-II实时操作系统在嵌入式平台上进行移植的一般方法和技巧

#uCOS-II实时操作系统在嵌入式平台上进行移植的一般方法和技巧

引言---实时操作系统地使用,能够简化嵌入式系统地应用开发,有效地确保稳定性和可靠性,便于维护和二次开发.μC/OS-II是一个基于抢占式地实时多任务内核,可固化、可剪裁、具有高稳定性和可靠性,除此以外,μC/OS-II地鲜明特点就是源码公开,便于移植和维护.在μC/OS-II官方地主页上可以查找到一个比较全面地移植范例列表.但是,在实际地开发项目中,仍然没有针对项目所采用芯片或开发工具地合适版本.那么,不妨自己根据需要进行移植.本文则以在TMS320C6711 DSP上地移植过程为例,分析了μC/OS-II在嵌入式开发平台上进行移植地一般方法和技巧.μC/OS-II移植地基本步骤在选定了系统平台和开发工具之后,进行μC/OS-II地移植工作,一般需要遵循以下地几个步骤:● 深入了解所采用地系统核心● 分析所采用地C语言开发工具地特点● 编写移植代码● 进行移植地测试● 针对项目地开发平台,封装服务函数<类似80x86版本地PC.C和PC.H)系统核心无论项目所采用地系统核心是MCU、DSP、MPU,进行μC/OS-II地移植时,所需要关注地细节都是相近地.首先,是芯片地中断处理机制,如何开启、屏蔽中断,可否保存前一次中断状态等.还有,芯片是否有软中断或是陷阱指令,又是如何触发地.此外,还需关注系统对于存储器地使用机制,诸如内存地地址空间,堆栈地增长方向,有无批量压栈地指令等.在本例中,使用地是TMS320C6711 DSP.这是TI公司6000系列中地一款浮点型号,因为其时钟频率非常高,且采用了超常指令字<VLIW)结构、类RISC指令集、多级流水等技术,所以运算性能相当强大,在通信设备、图像处理、医疗仪器等方面都有着广泛地应用.在C6711中,中断有3种类型,即复位、不可屏蔽中断<NMI)和可屏蔽中断<INT4-INT15).可屏蔽中断由CSR寄存器控制全局使能, 此外也可用IER寄存器分别置位使能.而在C6711中并没有软中断机制,所以μC/OS-II地任务切换需要编写一个专门地函数实现.此外,C6711也没有专门地中断返回指令、批量压栈指令,所以相应地任务切换代码均需编程完成.因为采用了类RISC核心,C6711地内核结构中,只有A0-A15和B0-B15这两组32bit地通用寄存器.C语言开发工具无论所使用地系统核心是什么,C语言开发工具对于μC/OS-II是必不可少地. 最简单地信息可以从开发工具地手册中查找,比如:C语言各种数据类型分别编译为多少字节;是否支持嵌入式汇编,格式要求怎样;是否支持“interrupt”非标准关键字声明地中断函数;是否支持汇编代码列表(list>功能,等等.上述地这样一些特性,会给嵌入式地开发带来很多便利.TI地C语言开发工具CCS for C6000就包含上述地所有功能.而在此基础上,可以进一步地弄清开发工具地一些技术细节,以便进行之后真正地移植工作.首先,开启C编译器地“汇编代码列表(list>”功能,这样编译器就会为每个C 语言源文件生成其对应地汇编代码文件.在CCS开发环境中地方法是:在菜单“/Project/Build options”地“Feedback”栏中选择“Interlisting:Opt/C and ASM(-s>”;或者,也可以直接在CCS地C编译命令行中加上“-s”参数.然后分别编写几个简单地函数进行编译,比较C源代码和编译生成地汇编代码.例如:void FUNC_TEMP (void>{Func_tmp2(>。

UCOS_II在PC上的移植(详细版)

UCOS_II在PC上的移植(详细版)

UCOS II在PC上的移植网上移植教程有不少,不过对于初学者还是容易出问题,在这里将移植的详细过程记录如下,建议有兴趣的同学,找台电脑,从头试一遍,这样就算是入门了.一、准备工作在PC上移植ucos系统,因为ucos系统的源代码是c语言写的,因此编译C的软件必不可少。

在pc机上运行,还需要对pc的设备进行一空的控制,会用到汇编语言,因此汇编语言的编译软件也必不可少。

再有就是操作系统的源码,这些都准备好了,就可以进行移植了。

一些教材在移植是c编译环境选BORLAND C++ 4.5,汇编编译用TASM5.0,网络上能找到的移植方法基本都是基于这2个软件的。

这2个编译软件和操作系统源码可以通过网络下载。

图1 ucos移植的必备文件下载解压后,如图1所示。

下边开始安装,编译软件。

BORLAND C++和TASM5.0安装顺序不会影响到使用,在安装之前先来看下c盘的文件结构。

在图2中,c盘根目录下只有3个文件夹,当我们配置完成后,会多出4个文件夹。

图2 编译环境安装前c盘文件结构二、开始安装1.安装编译软件BORLAND C++ 4.5。

在BORLAND C++ 4.5安装文件包里找到找到install.exe文件并双击,默认的安装路径就C:\BC45。

因此安装时,可以用默认设置一直继续,安装过程如图3所示(注意安装包里还有一个setup文件,请不要用它来安装)。

图3 bc4.5安装界面2.安装汇编编译软件TASM5.0(1)这一步如果不小心,很容易安装不正确。

先在C盘建立一个名为TASM的文件夹,然后把TASM5.0安装文件里的所有文件都复制进去。

如图4所示,双击图4中的install 文件开始安装。

图4 TASM5.0安装(2)在弹出的界面按回车键继续,出现安装选择文件界面,将默认的A改为C如图5所示。

图5 修改盘符(3)按回车键继续,出现一个路径设置的界面,继续按回车键,出现安装配置界面如图6所示。

实验一 uCOS-II的移植

实验一 uCOS-II的移植

实验一uC/OS-II的移植1.实验目的(1)理解uCOS-II实时内核的工作原理;(2)熟悉uCOS-II在XS128上的移植过程;(3)掌握uCOS-II移植的细节。

2.实验任务(1)观察示例程序中的代码,体会实时操作系统与前后台程序的不同之处。

(2)完成由前后台程序编程到基于实时操作系统编程的思想转变。

3.预习要求(1)参考《嵌入式实时操作系统uCOS-II》(第2版),熟悉uCOS-II各模块的基本工作原理。

(2)参考《单片机与嵌入式系统开发方法》第9章内容以及《uCOS-II移植说明文档》。

熟悉uCOS-II在XS128上的移植过程。

4.实验步骤(1)打开示例程序,观察程序结构。

(2)识别出哪些是与硬件无关的文件,哪些是移植需要修改和添加的文件。

(3)打开OS_CPU.H文件,该文件定义CPU的数据类型,定义相关的宏。

打开OS_CPU_C文件,分析文件里各个函数的作用。

这两个文件是与CPU特性有关的文件。

(4)分别打开OS_CFG.H, INCLUDES.H. OS_CFG.H这三个文件,了解这三个文件的作用。

用户根据自己的应用系统来定制合适的内核服务功能.包括两个文件:OS_CFG.H, INCLUDES.H. OS_CFG.H是来配置内核, 用户根据需要对内核进行定制, 留下需要的部分, 去掉不需要的部分, 设置系统的基本情况. 比如系统可提供的最大任务数量, 是否定制邮箱服务, 是否需要系统提供任务挂起功能, 是否提供任务优先级动态改变功能等等;头文件INCLUDES.H为整个实时系统程序所需要的文件,包括了内核和用户的头文件。

(5)修改.prm文件中的中断向量,将其中的ROM_C000 = READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xFEFF;改为ROM_C000 = READ_ONLYDATA_NEAR IBCC_NEAR 0xC000 TO 0xEEFF;将结尾处原有的VECTOR 0 _Startup;改为VECTOR ADDRESS 0xEFFE _Startup;再添加上VECTOR ADDRESS 0xEFF6 OSCtxSw;VECTOR ADDRESS 0xEFF0 OSTickISR两个中断向量。

uCOS-II移植实验

uCOS-II移植实验

17

基础知识
OS_CPU.S的移植 -OSStartHighRd
OSStartHighRd()函数是在OSStart()多任务启动之后,从最高优先 级任务的TCB控制块中获得该任务的堆栈指针sp,通过sp依次将cpu现 场恢复,这时系统就将控制权交给用户创建的该任务进程,直到该任 务被阻塞或者被其他更高优先级的任务抢占cpu.该函数仅仅在多任务 启动时被执行一次,用来启动第一个,也就是最高优先级的任务执行.
void OSIntCtxSw(void) { need_to_swap_context = 1; }
12

基础知识
OS_CPU.S的移植 -时钟节拍中断服务函数
时钟节拍是特定的周期性中断.这个中断可以看作是系统 心脏的脉动. 时钟的节拍式中断使得内核可以将任务延时若干个整数时 钟节拍,及当任务等待事件发生时,提供等待超时的依据. 时钟节拍率越快,系统的额外开销就越大.中断之间的时 间间隔取决于不同的应用,本系统使用S3C44B0的timer 0 作为时钟节拍源,产生间隔10mS的时钟节拍. OSTickISR()就是时钟节拍中断服务函数,也就是S3C44B0 的timer 0的中断处理函数.
jx44b0实验系统教案ucosii移植实验jx44b0实验系统教案ucosii移植实验武汉创维特信息技术有限公司201969提纲11113333222244445555基础知识实验目的实验内容预备知识实验设备6666实验过程7777实验报告要求实验目的实验目的了解ucosii内核的基本原理和主要结构掌握将ucosii内核移植到arm处理器上的基本方法掌握ucosii下基本多任务应用程序的编写实验内容实验内容学习ucosii再arm处理器上的移植过程编写简单的多任务应用程序同时实现跑马灯和数码管显示的功能预备知识预备知识了解嵌入式操作系统的构架以及具体的ucosii的组成了解操作系统的移植方法实验设备实验设备jx44b0教学实验箱adt1000仿真器和adtide集成开发环境串口连接线基础知识ucosii概述ucosii在特定处理器上的移植工作绝大部分集中在多任务切换的实现上因为这部分代码主要是用来保存和恢复处理器现场许多操作如读写寄存器操作不能用c语言只能使用特定的处理器的汇编语言来完成

ARM课程设计UCOSII移植实验

ARM课程设计UCOSII移植实验

嵌入式系统课程设计1 、设计目的(1)掌握UC/OS-II移植到ARM的方法。

(2)了解UC/OS-II的基本原理及移植条件。

(3)掌握UC/OS-II的用户程序的编写格式。

2、设计要求要求建立两个任务,一个按键检测任务,一个控制蜂鸣器。

3、电路图(原理图)(一)蜂鸣器控制(二)LED显示4、程序/**************************************************************************** * 文件名:* 功能:头文件和宏定义* 说明:/**************************************************************************** #include "config.h"#include "stdlib.h"// P0.7为蜂鸣器的控制I/O#define BEEP (1<<7)// LED控制宏函数定义。

LED1--LED8的控制I/O为P1.16--P1.23#define LED_ADJ 16#define LED_IOCON (0xFF<<LED_ADJ)#define LED_OFF() IO1SET=LED_IOCON#define LED_DISP(dat) LED_OFF(); IO1CLR=((dat)<<LED_ADJ)#defineTaskStkLengh 100 //定义用户任务堆栈长度OS_STK TaskStk0[TaskStkLengh]; //Define the Task0 stack 定义用户任务0的堆栈OS_STK TaskStk1[TaskStkLengh]; //Define the Task1 stack 定义用户任务1的堆栈void Task0(void *pdata); //Task0 任务0void Task1(void *pdata); //Task0 任务1/**************************************************************************** ** 主函数/**************************************************************************** int main (void){OSInit ();OSTaskCreate (Task0,(void *)0, &TaskStk0[TaskStkLengh - 1], 2);OSStart ();return 0;}/*************************************************************************** ** Task0 任务0/**************************************************************************** void Task0(void *pdata){ const uint8 DISP_TAB[32] = { 0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x00,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0x00 };uint8 i;pdata = pdata;TargetInit ();PINSEL0 = 0x00000000; // 设置P0口管脚连接GPIOIO0DIR = BEEP; // 设置蜂鸣器控制口为输出IO0SET = BEEP;IO1DIR = LED_IOCON; // 设置LED1--LED8的控制口为输出LED_OFF();// 建立任务1(用于蜂鸣器控制)OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 3);while (1){ for(i=0; i<32; i++){ LED_DISP(DISP_TAB[i]); // 输出LED显示数据OSTimeDly(OS_TICKS_PER_SEC/2); // 延时0.5S}}}/**************************************************************************** ** Task1 任务1/**************************************************************************** void Task1(void *pdata){pdata = pdata;while (1){ OSTimeDly(OS_TICKS_PER_SEC*10); // 延时10SIO0CLR = BEEP; // 控制蜂鸣器响OSTimeDly(OS_TICKS_PER_SEC/2);IO0SET = BEEP;}}/**************************************************************************** ** End Of File/****************************************************************************5、结论及分析本次设计,硬件设计完成后,将程序烧写入芯片后,实习了预期的目标,完成了两个任务:一个按键检测任务和一个控制蜂鸣器。

uCOS-II嵌入式实时操作系统原理与移植

uCOS-II嵌入式实时操作系统原理与移植
任务调度前上下文切换
1,决定是否进行上下文切换 2,保存当前执行进程的上下文
包括程序计数器PC、通用寄存器、 与任务有关的数组、表格、链等。
uC/OS-II采用可
剥夺实时内核,
含义是最高优先
0
级任务一旦就绪,
总能得到CPU使
1
用权。
系统保留4个
2
最高优先级
3
4
5
执行该任务
6
7
……
uC/OS-II 的中断(ISR)
任务2—TCB--就绪—任务堆栈
任务3--TCB--等待—任务堆栈
任务4--TCB --睡眠—任务堆栈
uC/OS-II的任务之间通信
任务之间共享的信息成为事件,同一时刻只能有一个任务使 用共享信息,因此为每个事件构建一个事件控制块ECB来保 证任务之间安全共享信息。事件控制块总数由OS_CFG.H中的 OS_MAX_EVENTS定义。事件包括信号量、邮箱、消息队列。
内存组配置文件 储存器映射MMU初始化与操作 Nand flash控制器初始化与操作
与CPU相关的配置选项 开机画面BMP文件 开机画面BMP文件 开机画面BMP文件 初始化mini2440目标板 定义任务优先级、堆栈大小及函数原型声明 初始化操作系统定时器0 开机画面BMP文件
关于信号量和等待的API功能函数
//任务循环
{
OSPrintf("\nEnter Main Task\n");
OSTimeDly(OS_TICKS_PER_SEC); //将任务延迟一段时间,进入等待态
}
}
uC/OS-II的任务都运行在无限循环中。
欢迎访问机电技术博客:/spurtltl@126/

μcos_II之移植篇

μcos_II之移植篇

/**Author:Callon Huang*Version:1.0*Time:2014/11/5*blog:/u/2451220761*/希望博客也能帮到你~第一步:μcosII源码下载/downloadcenter/STM32固件库stm32f10x_stdperiph_lib.zip的下载第二步:新建文件夹,并准备子目录:其中Software是μcosII源码下载完成后拷贝过来的,其它的都自己新建.App 用来存放应用程序文件,Bsp 用来存放版级驱动文件,Lib 用来存放 STM32 的标准外设库文件,Source 用来存放uCOS 文件第三步:把Software里的uCOS-II、uC-LIB和uC-CPU文件夹到Source里并把后两者拷贝到uCOS-II文件夹里,最后如下:第四步:找到Software\EvalBoards\ST\STM32F103ZE-SK\IAR下的BSP文件夹,复制到Source文件夹下第五步:找到Software\EvalBoards\ST\STM32F103ZE-SK\IAR下的OS-Probe-LCD文件夹,复制到Source文件夹下并改名为APP第六步:解压下载好的stm32f10x_stdperiph_lib.zip固件库:找到stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Librari es\STM32F10x_StdPeriph_Driver下的inc和src文件夹并复制到Lib 文件夹下第七步:复制stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Librari es\CMSIS下的CM3文件夹到Lib文件夹下第八步:删除一些不需要的文件:APP文件夹只需要:BSP文件夹只需要:在Software\CPU\ST\STM32里也有inc和src文件夹,但是比STM32固件库的要多两个文件stm32f10x_systick.c和stm32f10x_systick.h把这两个文件拷贝到SysTick文件夹下.第九步:建立工程my_ucosII,把所有的.c文件和.asm文件都加进来:‘第十步:对工程进行一些设置:Device就不用说了;Target不变;Output勾选上Create HEX File,并在里选择Obj文件夹;C/C++中添加头文件所在路径,否则会出现大量如下编译错误:头文件路径:Libraries文件夹是这三个最后这部分全部设置好后,如下:最后总体设置完如下:Debug里最后下载程序的时候,如果碰到MDK中出现“Error Flash download failed-Cortex-M3”错误,可以通过上面的添加On-chip-Flash来解决。

ucos ii移植过程详解

ucos ii移植过程详解

uCOS-II移值过程实例讲解我将uCOS-II 移植到了EPONS 的C33209的平台上,接下来我就基于我移植好的代码讲解如何将uCOS-II从一种MCU移植到另一种MCU。

首先介绍uCOS-II的文件,如下表:ucos_ii.hos_cfg.hos_cpu.hos_core.cos_dbg_r.cos_flag.cos_mbox.cos_mem.cos_mutex.cos_q.cos_sem.cos_task.cos_time.cucos_ii.cos_cpu_c.cos_cpu_a.asm其中我们和硬件平台相关的文件的文件名被加粗了,也就是说若要将uCOS-II移植到新的平台上只要关心被以上四个文件就行了。

当然你也可以根据需要再添加你自己的和平台相关的文件,事实上我也是这么做的。

在我移植的例子中就添加了四个和平台相关的文件,文件如下表:crt0.cdrv_rtc.cvector.cext.scrt0.c是用来初始化系统的比如说MCU的一些特殊寄存器、设置外围的总线接口,等。

drv_rtc.c是用来初始化系统中的一个RTC的,这个RTC可以为内核提供必要的基于时间片调度的时基。

同时提供了对RTC开始和停止的操作函数。

在我的例子中RTC会每秒产生32次中断。

vector.c顾名思义,它是系统上电后为系统提供矢量入口表的文件,当然也包括中断向量表。

ext.s是为uc/OS-II 提供OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()函数的具体实现以及在用户程序的中断函数出入时要调用的状态保护和状态恢复函数OS_SA VEALL ()和OS_RESTOREALL ()。

前面两个函数的功能是:OS_ENTER_CRITICAL()屏蔽中断;OS_EXIT_CRITICAL()恢复原来的中断使能状态。

1. os_cpu_a.asm的说明要想顺利的移植首先要了解uCOS-II的一些基本概念。

uCOS-II操作系统简介及实验

uCOS-II操作系统简介及实验
进入临界段: 进入临界段:OS_ENTER_CRITICAL() 退出临界段:OS_EXIT_CRITICAL()。 退出临界段: 。

这两个宏的定义取决于所用的微处理器, 这两个宏的定义取决于所用的微处理器,每种微 处理器都有自己的OS_CPU.H文件。 文件。 处理器都有自己的 文件
uC/OS-II操作系统 uC/OS-II操作系统
uC/OS-II操作系统 uC/OS-II操作系统
1.2 uC/OS-II特点 特点
• 1、uC/OS-II内核具有很强的可移植性。 内核具有很强的可移植性。 、 内核具有很强的可移植性 • 2、具有可抢占的实时多任务调度功能。 、具有可抢占的实时多任务调度功能。 • 3、提供了许多系统服务,如信号量、消 、提供了许多系统服务,如信号量、 •
任务状态
• • • • • •
休眠态 - OSTaskCreate()或OSTaskCreateExt() 或 就绪态 等待态,就绪态 就绪态,运行态 等待态 就绪态 运行态 - OSTaskDel() - 休眠态 就绪态 - OSStart() - 运行态 运行态 - OSTimeDly()或OSTimeDlyHMSM() , 或 OSSemPend(),OSMboxPend(),或OSQPend() , , 等待态 等待态 - OSTimeTick() -就绪态 就绪态 空闲任务 - OSTaskIdle()
uC/OS-II操作系统 uC/OS-II操作系统
任务调度
• μC/OS-Ⅱ总是运行进入就绪态任务中优 μC/OS先级最高的那一个。 先级最高的那一个。确定哪个任务优先 级最高, 级最高,下面该哪个任务运行了的工作 是由调度器(Scheduler)完成的。 是由调度器(Scheduler)完成的。

uCOS-II在arm上的移植

uCOS-II在arm上的移植

总结一下移植中浪费我时间的几个小错误吧,这完全是个人粗心导致的失误:
1、在os_cpu.h文件中需要用宏定义将OS_TASK_SW指向OSCtxSw函数,而我开始像以前一样直接将OSCtxSw函数与0号软终端链接起来,结果发现函数调用不成功。后来直接用宏定义将OS_TASK_SW define为OSCtxSw函数,初步调试通过,即验证OSCtxSw函数正确,但是到后来调用任务的时候却发现任务切换不正常,不得不重新将函数与中断结合起来,当然就不能还是0号中断了,而是改为一个比较保险的软终端,这个问题纠结了很长时间。
2)数据堆栈;
c51中,由于我们使用OS,采用的LARGE编译模式,所以数据堆栈的指针是“?C_XBP”, 栈的生长方向是向下的,栈空间分配在51的外部RAM(xdata)中。
3)C51中断中堆栈的保护;
研究中断中堆栈的保护的意义在于,因为uCOS中的任务切换,本身就是模拟一次中断的发生:保护Task1的CPU寄存器,SP切换到Task2的堆栈,弹出Task2的CPU寄存器。用C51写中断函数的时候,编译器会自动保护CPU的寄存器,所以中断返回时任务调度OSIntCtxSw(),就不用重新保护寄存器。
实时系统和前/后台系统;
前/后台系统:一个大循环,循环查询各种标志位。如果标志位置位,就执行相应的服务程序。标志位就是标志事件的发生,事件响应延时处于不可预测状态。最坏的情况是循环中所有其他的事件服务程序执行完,才响应当前事件。中断服务虽然能即时/优先响应,但是它们和主循环的通讯,也是通过置主循环中相应的标志位来完成的。
我主要想讲一下自己最近移植uCOS-II的心得,因为最近也在学习操作系统,所以这段日子对于uCOS-II的学习的确也让我对于操作系统有了一个实际深刻的认识。

uCOS-II嵌入式操作系统介绍与移植

uCOS-II嵌入式操作系统介绍与移植

OSStartHighRd
1、该函数是在OSStart函数中调用 2、负责从最高优先级任务的TCB中获得该任务的堆
栈指针sp,并依次将cpu现场恢复,这时系统就将 控制权交给用户创建的该任务进程,直到该任务被 阻塞或者被其他更高优先级的任务抢占cpu 3、该函数仅在多任务启动时被执行一次,用来启 动之前创建的第一个,也就是最高优先级的任务执 行
3、可从网站上获 得全部源码及其在各种体系结构平 台上的移植范例。
uC/OS-II特点
1、uC/OS-II内核具有可抢占的实时 多任务调度功能
2、提供了许多系统服务,如信号量、 消息队列、邮箱、内存管理、时间 函数等
3、这些功能可以根据不同的需求进 行裁减。
uC/OS-II的移植
ARM处理器相关宏定义
1、退出临界区
#defineOS_ENTER_CRITICAL() ARMDisableInt()
2、进入临界区
#defineOS_EXIT_CRITICAL() ARMEnableInt()
堆栈增长方向
1、堆栈由高地址向低地址增长,这个也 是和编译器有关的,当进行函数调用时, 入口参数和返回地址一般都会保存在当 前任务的堆栈中,编译器的编译选项和 由此生成的堆栈指令就会决定堆栈的增 长方向。
#define OS_STK_GROWTH 1
OS_CPU.c的移植
1、任务堆栈初始化 2、系统hook函数 3、中断级任务切换函数
任务堆栈初始化OSTaskStkInit
1、由OSTaskCreate或OSTaskCreateExt调用 2、用来初始化任务的堆栈并返回新的堆栈指针stk。
退出/进入临界区函数 ARMDisableInt/ARMEnableInt
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验目的
内核的主要结构。 2.掌握将uC/OS-II 内核移植到ARM7 处 理器上的基本方法。
1.了解uC/OS-II
实验工具
实验平台 ADS1.2 超级终端
实验原理
所谓移植,指的是一个操作系统可以在某
个微处理器或者微控制器上运行。 设计的语言 C:主要开发工具 汇编:读写处理器、寄存器时只能通过汇 编语言来实现

C语言函数


后5个函数为接口函数,可以不加代码
uC/OS-II的启动
void main (void) { OSInit(); // 初始化uC/OS-II
. 通过调用OSTaskCreate()或 OSTaskCreateExt()创建至少一个任务; . OSStart(); //开始多任务调度,永不返回
所涉及到的函数

汇编函数

OSStartHighRdy() OSCtxSw() OSIntCtxSw() OSTickISR()
void void void void void void void *OSTaskStkInit (void (*task)(void *pd),void *pdata, *ptos, INT16U opt) OSTaskCreateHook (OS_TCB *ptcb) OSTaskDelHook (OS_TCB *ptcb) OSTaskSwHook (void) OSTaskStatHook (void) OSTimeTickHook (void)
}
基于uC/OS的应用开发
void YourTask (void *pdata)
{ /* 用户代码 */
OSTaskDel(OS_PRIO_SELF); }
添加两个新任务
添加两个新任务, 目的:
通过串口在超级终端上分别显示字符串。
uC/OS-II在ARM平台的移植
复习
实验平台的搭建与配置 串口、AD/DA模块直流电机/步进电机等 以及Boot Loader的熟悉,与操作
实验内容
1.将uC/OS-II
内核移植到ARM7 微处理
器 上。 2.创建两个任务task1、task2,分别向串 口 输出数据,在超级终端上显示当前正在 运行那个任务。
移植的条件
1.处理器的C编译器能产生可重入代码。 2.在程序中可以打开或者关闭中断。 3.处理器支持中断,并且能产生定时中断
(通常在10Hz 1000Hz之间)。 4.处理器支持能够容纳一定量数据的硬件 堆栈。 5.处理器有将堆栈指针和其他CPU寄存器 存储和读出到堆栈(或者内存)的指 令。
相关文档
最新文档