基于stm32的ucosii系统移植.docx
《基于stm32的ucosii系统移植.docx》由会员分享,可在线阅读,更多相关《基于stm32的ucosii系统移植.docx(34页珍藏版)》请在冰豆网上搜索。
基于stm32的ucosii系统移植
基于STM32的u/COS-II系统移植
【摘要】本文硬件平台采纳ARM公司基于ARMV7架构的Cortex-M3系列处置器STM32F103,利用安富来公司现有的开发板,移植一个基于u/COS-II操作系统的应用程序框架(系统移植);创建多个任务,并通过利用消息邮箱进行两个任务之间的通信。
本文重点是把u/COS-II系统移植到程序中来,进而把各个大体功能模块化,并划分为几个主任务,以便实现嵌入式系统的操作。
【关键字】u/COS-IISTM32系统移植消息邮箱串口通信
【引言】随着人类社会经济的不断进展,科研领域不断的拓宽,嵌入式系统产品渐渐完善,并在全世界各行业取得普遍应用。
通过移植嵌入式操作系统,运算性能够更好地治理内存,而且在专门大程度上提高系统的实时性。
本设计通过在STM32上移植u/COS-II操作系统,实现了流水灯闪烁,利用消息邮箱实现多任务间的通信,并通过串口将信息打印到PC终端等功能。
加深了笔者对嵌入式操作系统的明白得。
【正文】
1U/COS-II的简介
U/COS-II的前身是UCOS,最先出自于1992年美国嵌入式系统专家Jean在《嵌入式系统编程》杂志的5月和6月刊上刊登的文章连载,并把UCOS的源码发布在该杂志的BBS上。
目前最新的版本:
U/COS-lll已经出来,可是此刻利用最为普遍的仍是U/COS-II,本章咱们要紧针对U/COS-II进行介绍。
U/COS-II是一个能够基于ROM运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,专门适合于微处置器和操纵器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。
为了提供最好的移植性能,U/COS-II最大程度上利用ANSIC语言进行开发,而且已经移植到近40多种处置器体系上,涵盖了从8位到64位各类CPU(包括DSP)。
U/COS-II是专门为运算机的嵌入式应用设计的,绝大部份代码是用C语言编写的。
CPU硬件相关部份是用汇编语言编写的,总量约200行的汇编语言部份被紧缩到最低限度,为的是便于移植到任何一种其它的CPU上。
用户只要有标准的ANSI的C交叉编译器,有汇编器、连接器等软件工具,就能够够将U/COS-II嵌人到开发的产品中。
U/COS-II具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB。
U/COS-II已经移植到了几乎所有知名的CPU上。
U/COS-II构思巧妙。
结构简练精练,可读性强,同时又具有了实时操作系统的全数功能,尽管它只是一个内核,但超级适合第一次接触嵌入式实时操作系统者,能够说是麻雀虽小,五脏俱全。
U/COS-II(版本)体系结构如图1所示:
图1:
U/COS-II体系结构图
本设计利用的是U/COS-II的最新版本:
版本,该版本U/COS-II比初期的U/COS-II(如)多了很多功能(比如多了软件按时器,支持任务数最大达到255个等),而且修正了很多已知BUG。
从上图能够看出,U/COS-II的移植,只需要修改:
、和等三个文件即可,其中:
,进行数据类型的概念,和处置器相关代码和几个函数原型;,是移植进程中需要汇编完成的一些函数,要紧确实是任务切换函数;,概念一些用户HOOK函数。
图中按时器的作用是为U/COS-II提供系统时钟节拍,实现任务切换和任务延时等功能。
那个时钟节拍由OS_TICKS_PER_SEC(中概念)设置,一样设置U/COS-II的系统时钟节拍为1ms~100ms,具体依照所用途理器和利用需要来设置。
本设计中,我利用STM32的SYSTICK按时器来提供U/COS-II时钟节拍。
U/COS-II初期版本只支持64个任务,可是从版本开始,支持任务数提高到255个,只是对一样利用者来讲一样64个任务都是足够多了,一样很难用到这么多个任务。
U/COS-II保留了最高4个优先级和最低4个优先级的总共8个任务,用于拓展利用,但事实上,U/COS-II一样只占用了最低2个优先级,别离用于空闲任务(倒数第一)和统计任务(倒数第二),因此剩下给咱们利用的任务最多可达255-2=253个()。
所谓的任务,其实确实是一个死循环函数,该函数实现必然的功能,一个工程能够有很多如此的任务(最多255个),U/COS-II对这些任务进行调度治理,让这些任务能够并发工作(注意不是同时工作!
并发只是各任务连番占用CPU,而不是同时占用,任何时候仍是只有1个任务能够占用CPU),这确实是U/COS-II最大体的功能。
U/COS-II的任何任务都是通过一个叫任务操纵块(TCB)的东西来操纵的,每一个任务治理块有3个最重要的参数:
1,任务函数指针;2,任务堆栈指针;3,任务优先级;任务操纵块确实是任务在系统里面的身份证(U/COS-II通过优先级识别任务)。
在U/COS-II中,利用CPU的时候,优先级高(数值小)的任务比优先级低的任务具有优先利用权,即任务就绪表中老是优先级最高的任务取得CPU利用权,只有高优先级的任务让出CPU利用权(比如延时)时,低优先级的任务才能取得CPU利用权。
U/COS-II不支持多个任务优先级相同,也确实是每一个任务的优先级必需不一样。
任务的调度其实确实是CPU运行环境的切换,即:
PC指针、SP指针和寄放器组等内容的存取进程。
U/COS-II的每一个任务都是一个死循环。
每一个任务都处在以下5种状态之一的状态下,这5种状态是:
睡眠状态、就绪状态、运行状态、等待状态(等待某一事件发生)和中断效劳状态。
在U/COS-II中,与任务相关的几个重要函数:
1)创建任务函数
若是想让U/COS-II治理用户的任务,必需先成立任务。
U/COS-II提供了2个成立任务的函数:
OSTaskCreat和OSTaskCreatExt,咱们一样用OSTaskCreat函数来创建人任务,该函数的原型为OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTUprio)。
该函数包括4个参数:
task:
是指向任务代码的指针;pdata:
是任务开始执行时,传递给任务的参数的指针;ptos:
是分派给任务的堆栈的栈顶指针;prio是分派给任务的优先级。
每一个任务都有自己的堆栈,堆栈必需申明为OS_STK类型,而且由持续的内存空间组成。
能够静态分派堆栈空间,也能够动态分派堆栈空间。
OSTaskCreatExt也能够用来创建任务。
2)改变任务的优先级函数
U/COS-II在成立任务时,会分派给任务一个优先级,可是那个优先级并非是一成不变的,而是能够通过挪用U/COS-II提供的函数修改。
U/COS-II提供的任务优先级修改函数原型为:
INT8UOSTaskChangePrio(INT8Uoldprio,INT8Unewprio)。
3)任务挂起函数
任务挂起只是将被挂起任务的就绪标志删除,并做任务挂起记录,并无将任务操纵块任务操纵块链内外面删除,也不需要释放其资源。
被挂起的任务,在恢复(解挂)后能够继续运行。
U/COS-II提供的任务挂起函数原型为:
INT8UOSTaskSuspend(INT8Uprio)。
4)任务恢复函数
有任务挂起函数,就有任务恢复函数,通过该函数将被挂起的任务恢复,让调度器能够从头调度该函数。
U/COS-II提供的任务恢复函数原型为:
INT8UOSTaskResume(INT8Uprio)。
2.U/COS-II信号量和邮箱简介
系统中的多个任务在运行时,常常需要相互无冲突地访问同一个共享资源,或需要相互支持和依托,乃至有时还要相互加以必要的限制和制约,才保证任务的顺利运行。
因此,操作系统必需具有对任务的运行进行和谐的能力,从而使任务之间能够无冲突、流畅地同步运行,而不致致使灾难性的后果。
例如,任务A和任务B共享一台打印机,若是系统已经把打印机分派给了任务A,那么任务B因不能取得打印机的利用权而应该处于等待状态,只有当任务A把打印机释放后,系统才能唤醒任务B使其取得打印机的利用权。
若是这两个任务不如此做,那么会造成极大的混乱。
任务间的同步依托于任务间的通信。
在U/COS-II中,是利用信号量、邮箱(消息邮箱)和消息队列这些被称作事件的中间环节来实现任务之间的通信的。
两个任务通过事件进行通信的示用意如图2所示:
图2:
两个任务利用事件进行通信的示用意
在图2中任务1是发信方,任务2是收信方。
任务1负责把信息发送到时刻上,这项操作叫做发送事件。
任务2通过读取事件操作对事件进行查询:
若是有信息那么读取,不然等待。
读事件操作叫做请求事件。
为了把描述事件的数据结构统一路来,U/COS-II利用叫做事件操纵块(ECB)的数据结构来描述诸如信号量、邮箱(消息邮箱)和消息队列这些事件。
事件操纵块中包括包括等待任务表在内的所有有关事件的数据,事件操纵块结构体概念如下:
typedefstruct
{
INT8UOSEventType;硬件部份
本实验功能简介:
本程序共创建了6个任务:
1)u/COS-IIIdle任务,这是由操作系统创建的空闲任务,优先级最低
2)u/COS-IIStat任务,这是由操作系统创建的统计任务,统计CPU运行时刻、CPU占用率等
3)u/COS-IITmr任务,这是由操作系统创建的按时器任务,为应用程序提供软件按时器
4)AppTaskStart任务,这是由用户创建的启动任务,完成如下工作:
(a)初始化BSP
(b)创建1个邮箱AppUserIFMbox
(c)创建2个任务,1个是用户界面任务AppTaskUserIF,1个是按键检测任务AppTaskKbd
(d)以后操纵LED1指示灯依照100ms的周期闪烁
5)AppTaskKbd任务,这是由AppTaskStart创建的按键检测任务
按键检测任务AppTaskKbd实时检测USER键和TAMPER键的状态,当有键按下时,那么向邮箱AppUserIFMbox发送一条消息,消息内容为按键码变量的指针。
6)AppTaskUserIF任务,这是由AppTaskStart创建的用户界面任务户界面任务AppTaskUserIF等待邮箱中的消息,若是USER键按下的消息那么打印u/COS-II系统信息,若是收到TAMPER键按下那么打印所有的任务名称和任务优先级;若是没有收到任何信息那么打印一个旋转的字符和CPU运行时刻(单位为1个滴答)。
所要用到的硬件资源如下:
(1)指示灯LD1,LD2,LD3,LD4
(2)2个按键(USER/TAMPER)
(3)RS232串口
安富来开发板CPU对应的GPIO:
a)PB15连接了LED1指示灯,输出低电平点亮LED
b)PE1连接了USER键,低电平表示按下
c)PC13连接了TAMPER键,低电平表示按下
CPU的USART1:
a)PA9用于USART1的TX,连接到板子上的RS232芯片(SP3232)
b)PA10用于USART1的RX,连接到板子上的RS232芯片(SP3232)
c)串口为2线模式,无硬件流控,即无CTS和RTS口线
d)波特率为115200bps
e)8个数据位、1个起始位、1个停止位、无校验位、bit0先传输
f)软件查询方式,未用中断
CPU的中断
a)PendSVHandler用于u/COS-II内核,中断向量等于OSPendSV()函数地址
b)SysTick_Handler用于u/COS-II滴答,挪用了Tmr_TickISR_Handler()函数
4.软件部份
(1)main()函数
功能说明:
标准C函数入口
intmain(void)
{
CPU_INT08Uerr;
SystemInit();
/*禁止所有的中断*/
BSP_IntDisAll();
/*初始化"uC/OS-II"内核*/
OSInit();
/*创建一个启动任务(也确实是主任务)。
启动任务会创建所有的应用程序任务*/
OSTaskCreateExt(AppTaskStart,/*启动任务函数指针*/
(void*)0,/*传递给任务的参数*/
(OS_STK*)&AppTaskStartStk[APP_TASK_START_STK_SIZE-1],/*指向任务栈栈顶的指针*/
APP_TASK_START_PRIO,/*任务的优先级,必须唯一,数字越低优先级越高*/
APP_TASK_START_PRIO,/*任务ID,一般和任务优先级相同*/
(OS_STK*)&AppTaskStartStk[0],/*指向任务栈栈底的指针。
OS_STK_GROWTH决定堆栈增加方向*/
APP_TASK_START_STK_SIZE,/*任务栈大小*/
(void*)0,/*一块用户内存区的指针,用于任务控制块TCB的扩展功能
(如任务切换时保留CPU浮点寄放器的数据)。
一样不用,填0即可*/
OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);/*任务选项字*/
/*概念如下:
OS_TASK_OPT_STK_CHK使能检测任务栈,统计任务栈已用的和未用的
OS_TASK_OPT_STK_CLR在创建任务时,清零任务栈
OS_TASK_OPT_SAVE_FP若是CPU有浮点寄放器,那么在任务切换时保留浮点寄放器的内容
*/
/*指定任务的名称,用于调试。
那个函数是可选的*/
OSTaskNameSet(APP_TASK_START_PRIO,APP_TASK_START_NAME,&err);
/*启动多任务系统,操纵权交给uC/OS-II*/
OSStart();
}
(2)任务启动函数AppTaskStart()
功能说明:
这是一个启动任务,在多任务系统启动后,必需初始化滴答计数器(在BSP_Init中实现)在该任务中操纵流水灯的闪烁程序如下:
/*任务主体,必需是一个死循环*/
while
(1)
{
for(j=0;j<4;j++)
{
for(i=1;i<=4;i++)
{
bsp_LedOn(i);
OSTimeDlyHMSM(0,0,0,50);
bsp_LedOff(i);
OSTimeDlyHMSM(0,0,0,50);
}02d\r\n",OSVersion()/100,OSVersion()%100);
/*打印滴答(心跳)速度,即每秒多少次心跳*/
printf("TickRate:
%d\r\n",OS_TICKS_PER_SEC);
/*打印CPU占用率*/
printf("CPUUsage:
%02d%%\r\n",OSCPUUsage);
/*打印CPU速度*/
printf("CPUSpeed:
%dMHz\r\n",BSP_CPU_ClkFreq()/1000000L);
/*打印CPU已运行时刻(单位:
滴答)*/
printf("#Ticks:
%d\r\n",OSTime);
/*打印上下文切换次数(contextswitches)*/
printf("#CtxSw:
%d\r\n",OSCtxSwCtr);
}
(7)任务信息打印函数DispTaskInfo()
staticvoidDispTaskInfo(void)
{
OS_TCB*ptcb;/*定义一个任务控制块指针,TCB=TASKCONTROLBLOCK*/
OS_STK_DATAstk;/*用于读取任务栈使用情况*/
ptcb=&OSTCBTbl[0];/*指向第1个任务控制块(TCB)*/
/*打印题目*/
printf("MicriumuC/OS-II\r\n");
printf("STSTM32(Cortex-M3)\r\n");
printf("PrioUsedFreePerTaskname\r\n");
/*遍历任务操纵块列表(TCBlist),打印所有的任务的优先级和名称*/
while(ptcb!
=NULL)
{
/*
ptcb->OSTCBPrio:
任务操纵块中保留的任务的优先级
ptcb->OSTCBTaskName:
任务操纵块中保留的任务名称,需要在创建任务的时候
挪用OSTaskNameSet()指定任务名称,比如:
OSTaskNameSet(APP_TASK_USER_IF_PRIO,"UserI/F",&err);
*/
OSTaskStkChk(ptcb->OSTCBPrio,&stk);/*获得任务栈已用空间*/
printf("%2d%5d%5d%02d%%%s\r\n",ptcb->OSTCBPrio,
,*100)/+,
ptcb->OSTCBTaskName);
ptcb=ptcb->OSTCBPrev;/*指向上一个任务控制块*/
}
}
5.系统功能
系统上电后,流水灯以100ms的周期“从左到右流动”→“从右到左流动”→“四个灯同时闪烁”;按键检测任务AppTaskKbd实时检测USER键和TAMPER键的状态,当有键按下时,那么向邮箱AppUserIFMbox发送一条消息,消息内容为按键码变量的指针。
用户界面任务AppTaskUserIF等待邮箱中的消息,若是USER键按下的消息那么打印u/COS-II系统信息,若是收到TAMPER键按下那么打印所有的任务名称和任务优先级。
具体运行结果如以下图(图3-图6)所示:
图3:
流水灯流动
图4:
流水灯闪烁
图5:
TAMPER键按下打印所有的任务名称和任务优先级
图6:
USER键按下打印u/COS-II系统信息
6心得体会
《嵌入式测控系统》是一门实践性很强的课,专门U/COS-II操作系统,关于一名仪器科学与技术的学生来讲,扎实把握该操作系统是一项必备的专业技术。
我关于这门课的学习,很多知识是从课件上看来的,而且看完以后,感觉自己已经把握的专门好了,但实际真正做东西的时候,仍是会感觉困难重重,而此时再去参考课件,便有了对知识的更深层次的明白得。
其实在这方面最应该感激的是网络给咱们带来的方便,通过上网搜索,很多问题都能够迎刃而解,而且很多网友都有自己独特的观点,在他们的讨论中看到了很多有效的东西。
“学以促用,用以促学,而且带着问题学习才能学到真正的知识”,这是这门专业课带给我的重要熟悉。
在这学期的学习中我学到了很多,也熟悉到我需要学习的东西更多,仅凭此刻学到的东西是远远不够的,要想在这方面作出一些成绩,必需继续尽力学下去。
7参考文献
1.《嵌入式实时操作系统uC/OS-II原理及应用》北京航空航天大学出版社出版,任哲编著
2.《UCOSII在STM32的移植详解.pdf》战舰开发板配套资料
3.《ucosII实时操作系统》北京航空航天大学出版社出版,任哲编著
4.《STM32开发指南-库函数版本.pdf》安富来开发板配套资料
毕业设计(论文)治理规定
及相关表格汇编
本科生毕业设计(论文)治理规定……………………1
毕业论文(设计)工作实施细那么(草案)……………2
优秀毕业论文评选方法………………………………7
毕业论文的写作与排版标准…………………………10
毕业设计(论文)写作模板…………………………14
毕业设计(论文)答辩提问记录表………………21
毕业设计第周工作总结……………………22
毕业设计(论文)进程跟踪表……………………23
毕业设计(论文)课题申请表………………………24
毕业设计(论文)任务书…………………………25
毕业设计(论文)开题报告…………………………26
毕业设计工作中期检查Ⅰ…………………………27
毕业设计工作中期检查Ⅱ……………………………28
大学
本科生毕业设计(论文)治理规定
为提高本科生毕业设计(论文)质量,增强毕业生毕业设计治理工作,特制定如下规定:
1.本科毕业设计工作从第七学期(四年级第一学期)考试周前,完成教师选题、师生见面及指导教师向学生下达任务书(见附表一)。
毕业设计从第八学期开学正式开始,十六周内完成。
2.毕业设计开始时,教师必需填写毕业设计课题申请表、并由系汇总后交院毕业设计领导小组审核。
(见附表)。
3.指导教师必需按期对学生辅导(每周至少两次),并将确信的周辅导时刻上报教学办,教学办将按期和不按期进行检查。
4.指导教师自行组织学生的开题报告,并填写开题报告表(见附表二)
5.增强中期的监督与检查,第一次检查时刻定在第五周,检查内容含学生资料阅读,方案论证情形。
第二次检查定在第十周,形式为:
由指导教师组织,院毕业设计领导小组成员旁听,学生口头汇报。
要紧检查学生的时期性结果。
两次检查学生均应填写中期检查报告表格(见附表三、四),指导教师或系对检查情形写出书面评语。
6.学生需上交一篇与本专业有关很多于5000字的外文文章翻译,并将原文和译文用A4打印加自设计封皮一路装订成册。
7.论文答辩前,指导教师必需给出评语及评分,然后由各系主任指定其他评阅人对论文进行评阅及评分(请参考毕业论文书面成绩评分表规定的评分标准评分)。
8.论文答辩由各系组织,并成立答辩委员会对所有学生论文进行答辩。
答辩必需给出答辩委员会意见及评分并填写相应表格。
答辩委员会成员必需按评分表中各项指标标准进行评分,然后由各成员给出的分数计算出得分。
9.毕业设计(论文)最终成绩计算:
指导教师评分x30%+评阅人评分x30%+答辩委员会评分x40%=总分
10.毕业设计(论文)提交的文档及装订要求
(1)毕业论文一份(包括封皮、目录、中英文摘要、内容及参考文献)
(2)很多于5000汉字的科技翻译资料一份(并将原文和译文用A4打印加自设计封皮一路装订成册)
(3)毕业论文简介(A4纸打印1~2页)(包括题目、专业、年级、姓名、指导教师、毕业论文所做的工作、解决的问题、创新的地方等)
(4)毕业设计任务书(加在毕业论文目录之前和毕业论文一路装订,)
(5)开题报告(加在毕业论文目录之前和毕业论文一路装订,)
(6)毕业设计工作中期检查表Ⅰ、Ⅱ
注(4)(5)(6)加在毕业论文目录之前和毕业论文一路装订。
11.毕业设计(论文)随正式论文一概附交电子文档(光盘或软盘)。
被推荐参加学校优秀毕业设计(论文)3%评选的,还要另附(符合发表格式要求的)修改成5000字左右的电子文档。
2005年12月修订
大学
毕业设计(论文)工作实施细那么(试行)
依照《毕业设计(论文)工作暂行规定》,为了进一步标准毕业设计(论文)工作的各个环节,结合我院实际情形,经院教学指导委员会讨论,院长办公联席会议通过,对我院毕业设计(论文)工作特制订以下实施细那么。
一、指导教师资格
毕业设计(论文)的指导教师原那么上应由各专业具有中级(含中级)以上专业技术职务的教师担任。
也能够聘用具有相应职称、学术水平高的工程技术人员担任。
指导教师名