嵌入式系统课程设计报告专业:通信工程班级:电1305—1班学号:20132637姓名:成林指导教师:王伟明电气与电子工程学院2015年7月前言嵌入式系统设计飞速的发展,渗透到社会生活的各个方面。STM32以其较高的性能和优越的性价比,已经成为单片机市场的主流之一。STM32F1系列属于中低端的32位ARM微控制器,该系列芯片是意法半导体(ST)公司出品,其内核是Cortex-M3。由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。相对μC/OS-II、embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行。作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。FreeRTOS的内核可根据用户需要设置为可剥夺型内核或不可剥夺型内核。当FreeRTOS被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU使用权,这样可保证系统满足实时性的要求;当FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU的使用权后才能获得运行,这样可提高CPU的运行效率。摘要随着现代科技的飞速发展,嵌入式技术早已渗透到我们生活的各个领域,大到航空航天,小到我们生活中所使用的遥控器,汽车上面的导航系统无不与嵌入式系统有着密切的关联。有些领域对嵌入式的实时性要求的非常严格,例如:医院里的心脏起搏器,车辆上的刹车等。这些关系着人们的生命安全,不容许有半点的失误,否则后果将会十分的严重。本设计课题就是基于STM32F103VET6芯片FreeRTOS实时操作系统移植的研究。使用了MDK开发软件,J-LINK在线调式等工具。最终实现了在上述芯片上跑四个任务,设置不同的优先级,来验证其实时性,取得了较好的效果。关键词嵌入式操作系统移植实时性目录一、课程设计任务要求.............................................................2二、系统硬件设计.....................................................................2三、系统软件实现.....................................................................4四、系统调试及实验结果.........................................................8五、总结......................................................................................92一、课程设计任务要求基于STM32开发版自己或团队协作完成一个项目,项目没有固定要求,要求最终能够在实验板上运行出预期的结果。二、系统硬件设计嵌入式系统组成框图应用程序API操作系统内核驱动设备专有硬件(嵌入式处理器、存储器、外设等)在本次的操作系统移植中,创建了四个任务,分别为:任务一:三个LED等的轮流闪烁;任务二:显示屏显示图片;任务三:键盘扫描;任务四:针对任务三所按下键进行相应的LED灯的亮灭。在所操控的实验板上LED的接法如下图所示图1LED的接线引脚三个LED灯分别接在PD口的36引脚与PB口的5引脚,故在程序中将其初始化为如下形式:图2LED初始化程序下表给出了,GPIO口工作转态的表示方法:3表格1GPIO口的输入输出模式三个独立按键的接口如下所示图3独立按键的引脚接法分别接在PC口的235口因此在键盘扫描的中做如下处理图4独立按键的初始化程序3寸液晶屏与芯片的接法如下图所示图5液晶屏的引脚接法4三、系统软件实现本次课程设计所用到的开发软件是MDK4.72。首先在软件中建立一个STM32FreeRTOS操作系统移植的工程。打开软件,点击建立工程,选择STM32F103VE芯片,如下所示:图5选择芯片单击OK,不添加启动代码,稍后自己添加。点击下图所示图标,创建新的分组,分别为Startup、USR、FWlib、CMSYS、FreeRTOS图6新建分组完成后如下所示图7示例图1接着在每个文件夹中添加STM32与FreeRTOS固件库中的文件,本次课程设计中添加的文件如下:在Startup中添加startup_stm32f10x_hd.s文件,路径为5STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm在USR中添加main.c、pic.c、lcd_dis24.c文件。在FWlib中添加stm32f10x_fsmc.c、stm32f10x_gpio.c、stm32f10x_rcc.c文件,路径为STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src在CMSYS文件夹中添加core_cm3.c、system_stm32f10x.c文件,路径为STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport与STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x在FreeRTOS文件夹中添加queue.c、tasks.c、list.c、port.c、heap_2.c,路径为FreeRTOSV8.2.1\FreeRTOS\Source、FreeRTOSV8.2.1\FreeRTOS\Source\portable\RVDS\ARM_CM3FreeRTOSV8.2.1\FreeRTOS\Source\portable\MemMang完成后的工程示意图如下:图8示例图2接着点击如下图标进入工程设置状态6图9工程设置点击c/c++在Define中输入USE_STDPERIPH_DRIVER,STM32F10X_HD在IncludePaths中创建新的路径完成后截图如下所示图10添加头文件路径建议将所有的.h文件都复制到一个文件夹内,这样只用添加一个路径即可,比较方便。接下来修改启动代码图11未修改的启动代码在_heap_limit下面添加PRESERVE8THUMBIMPORTxPortPendSVHandlerIMPORTxPortSysTickHandlerIMPORTvPortSVCHandler如下所示7图12修改后下面三句也要修改DCDSVC_Handler-DCDvPortSVCHandlerDCDPendSV_Handler-DCDxPortPendSVHandlerDCDSysTick_Handler-DCDxPortSysTickHandler修改后如图所示图13修改后的启动代码启动代码作用一般是:1)堆和栈的初始化;2)向量表定义;3)地址重映射及中断向量表的转移;4)设置系统时钟频率;5)中断寄存器的初始化;6)进入C应用程序。建立完整的工程后,就可以在main.c中编写程序了,具体的程序代码已附录的形式展现出来。图14部分主函数程序8上述代码为main.c中创建四个任务的代码,可以看到四个任务的优先级互不相同。下图为任务运行时的时序图:t1t2t3t4t5图15任务运行时的一个时序图0--t1时刻为任务1运行,其优先级最低。t1时刻,任务2转化为就绪转态,由于任务2的优先级比任务1的优先级要高,抢占任务1,执行任务2.t2时刻,系统检测到有按键按下,由于键盘扫描的优先级最高,故抢占任务2,执行任务4。t3时刻,任务4执行完成,由于检测到有按键按下,任务3转化为就绪转态,且任务3的优先级要高于任务2,系统在执行完任务4后会直接执行任务3,而不是任务2,。t4时刻,任务3执行完毕,没有更高优先级的任务处于就绪转态,所以开始继续执行上次没有执行完成的任务2。t5时刻,任务2执行完毕,没有高优先级的任务处于就绪转态,系统又开始执行任务1。四、系统调试及实验结果本次课程设计中在调试方面并没有遇到太大的困难,刚开始时由于工程没有设置正确,导致有一些文件没有添加进来,或者头文件的路径设置不对一直编译出错。不过后来经过自己上网查阅资料后,终于慢慢的建立了正确的工程,然后就没有再出现过较大的调试方面的问题了。在MDK中,使用J-LINK单步调试非常的有效,有时编译时可能出现没有错误与警告,但是程序下载后,在实验板上面可能没有任何现象。与预期的结果不符,让人摸不着头脑,这时使用J-LINK的调试的优越性就会十分明显的显示出来,会很方便找到出错的根源,然后找出相应的解决方法。这一点在设计中扮演者非常重要的角色。下图为在开发版的运行时的图片。9图16图17图18图19五、总结通过本次设计,初步的了解了STM32与FreeRTOS的一些功能,认识到了在STM32中编程语言的规范性与严谨性。现在根据一些参考资料基本上能够看懂一些STM32上的一些程序。由最初的一头雾水、不知所措,到后来慢慢的去研究,发现里面的程序代码有门道可循。刚从51单片机过渡来时看STM32上的程序时确实比较吃力,可是后来慢慢的自己去研究里面的函数,掌握函数的命名规则与函数的功能后,就发现看懂STM32程序也不是一件十分棘手的问题,虽然现在自己着手来编写一些复杂点的程序还是会有些吃力。但是,万里长征已经迈出了第一步,后面的事只要继续走下去,就只是一个时间的问题了。同时,也掌握了FreeRTOS中的一些基本的知识点,会使用消息队列,并已经在本次课程设计中的键盘扫描程序中得到了成功的体现,明白了的操作系统在执行任务的过程中,任务之间的切换规则,访问公共资源时,使用信号量的重要性等等。同时在和同学之间的比较中,明显的体现出了操作系统的优越性与方便些。