基于stm32的ucosii系统移植Word格式.docx
《基于stm32的ucosii系统移植Word格式.docx》由会员分享,可在线阅读,更多相关《基于stm32的ucosii系统移植Word格式.docx(34页珍藏版)》请在冰豆网上搜索。
,概念一些用户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,一般和任务优先级相同*/
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);
}02d\r\n"
OSVersion()/100,OSVersion()%100);
/*打印滴答(心跳)速度,即每秒多少次心跳*/
printf("
TickRate:
%d\r\n"
OS_TICKS_PER_SEC);
/*打印CPU占用率*/
CPUUsage:
%02d%%\r\n"
OSCPUUsage);
/*打印CPU速度*/
CPUSpeed:
%dMHz\r\n"
BSP_CPU_ClkFreq()/1000000L);
/*打印CPU已运行时刻(单位:
滴答)*/
#Ticks:
OSTime);
/*打印上下文切换次数(contextswitches)*/
#CtxSw:
OSCtxSwCtr);
(7)任务信息打印函数DispTaskInfo()
staticvoidDispTaskInfo(void)
OS_TCB*ptcb;
/*定义一个任务控制块指针,TCB=TASKCONTROLBLOCK*/
OS_STK_DATAstk;
/*用于读取任务栈使用情况*/
ptcb=&
OSTCBTbl[0];
/*指向第1个任务控制块(TCB)*/
/*打印题目*/
MicriumuC/OS-II\r\n"
);
STSTM32(Cortex-M3)\r\n"
PrioUsedFreePerTaskname\r\n"
/*遍历任务操纵块列表(TCBlist),打印所有的任务的优先级和名称*/
while(ptcb!
=NULL)
/*
ptcb->
OSTCBPrio:
任务操纵块中保留的任务的优先级
OSTCBTaskName:
任务操纵块中保留的任务名称,需要在创建任务的时候
挪用OSTaskNameSet()指定任务名称,比如:
OSTaskNameSet(APP_TASK_USER_IF_PRIO,"
UserI/F"
&
*/
OSTaskStkChk(ptcb->
OSTCBPrio,&
stk);
/*获得任务栈已用空间*/
%2d%5d%5d%02d%%%s\r\n"
ptcb->
OSTCBPrio,
,*100)/+,
OSTCBTaskName);
ptcb=ptcb->
OSTCBPrev;
/*指向上一个任务控制块*/
}
5.系统功能
系统上电后,流水灯以100ms的周期“从左到右流动”→“从右到左流动”→“四个灯同时闪烁”;
用户界面任务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月修订
毕业设计(论文)工作实施细那么(试行)
依照《毕业设计(论文)工作暂行规定》,为了进一步标准毕业设计(论文)工作的各个环节,结合我院实际情形,经院教学指导委员会讨论,院长办公联席会议通过,对我院毕业设计(论文)工作特制订以下实施细那么。
一、指导教师资格
毕业设计(论文)的指导教师原那么上应由各专业具有中级(含中级)以上专业技术职务的教师担任。
也能够聘用具有相应职称、学术水平高的工程技术人员担任。
指导教师名