零死角玩转STM32系统篇

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

-第2页-友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。M3的世界,与野火同行,乐意惬无边。另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。内容上会给你带来更多的惊喜。是一本学习STM32必备的工具书。敬请期待!-第3页-从0开始移植UCOS-II到野火STM32开发板前言uC/OS是一个微型的实时操作系统,包括了一个操作系统最基本的一些特性,如任务调度、任务通信、内存管理、中断管理、定时管理等。而且这是一个代码完全开放的实时操作系统,简单明了的结构和严谨的代码风格,非常适合初涉嵌入式操作系统的人士学习。很多人在学习STM32中,都想亲自移植一下uC/OS,而不是总是用别人已经移植好的。在我学习uC/OS的过程中,查找了很多资料,也看过很多关于如何移植uC/OS到STM32处理器上的教程,但都不尽人意,主要是写得太随意了,思路很乱,读者看到最后还是不确定该怎样移植。为此,我决定写这个教程,让广大读者真正了解怎样移植。学前建议:C语言+数据结构WildfireTeam2011年11月3日-第4页-1、官方源代码介绍首先我们下载源代码,官方下载地址:(下载资料需要注册帐号)或者网盘下载:我们需要下载的就是下面这个,因为我用到的开发板芯片是STM32F103VET6注意:下载的源代码开发环境是IAR编译器的。我们使用的uCOS是2.86版本。下载解压后可以看到Micrium含有三个文件夹:-第5页-文件名说明AppNotes包含uCOS-II的说明文件,其中文件Micrium\AppNotes\AN1xxx-RTOS\AN1018-uCOS-II-Cortex-M3\AN-1018.pdf是很重要的。这个文件对uC/OS在M3内核移植过程中需要修改的代码做了详细的说明。Licensing包含了uCOS-II使用许可证Software应用软件,我们这里用到的就是uCOS-II文件夹。在整个移植过程中我们只需用到uCOS-II下的两个文件,分别是Ports和Source.uCOS-IIDocuC/OS官方自带说明文档和教程Ports官方移植到M3的移植文件(IAR工程)cpu.h定义数据类型、处理器相关代码、声明函数原型cpu_c.c定义用户钩子函数,提供扩充软件功能的入口点。(所谓钩子函数,就是指那些插入到某函数中拓展这些函数功能的函数)cpu_a.asm与处理器相关汇编函数,主要是任务切换函数os_dbg.c内核调试数据和函数SourceuC/OS的源代码文件ucos_ii.h内部函数参数设置os_core.c内核结构管理,uC/OS的核心,包含了内核初始化,任务切换,事件块管理、事件标志组管理等功能。-第6页-os_time.c时间管理,主要是延时os_tmr.c定时器管理,设置定时时间,时间到了就进行一次回调函数处理。os_task.c任务管理os_mem.c内存管理os_sem.c信号量os_mutex.c互斥信号量os_mbox.c消息邮箱os_q.c队列os_flag.c事件标志组CPUSTM32标准外设库EvalBoardsmicrium官方评估板的代码OS-Probe-LCDos_cfg.h内核配置uC-CPU基于micrium官方评估板的CPU移植代码uC-LIBmicrium官方的一个库代码uC-ProbeuC-Probe有关的代码,是一个通用工具,能让嵌入式开发人员在实时环境中监测嵌入式系统。以上这些都是下载下来的官方资源。有没有发现,uC/OS的代码文件都被分开放到不同的文件夹里了?呵呵,这个是官方移植好到STM32的uC/OS系统,他已经帮我们对uC/OS的文件进行分类存放。如果你不想要移植好的,也可以下载没有移植的,那样就所以文件都放在一个文件夹里。下载地址:提示一下,如果是没移植好的,是找不到main函数的哦!初学者,相信很多都下载没移植好的,然后直接看它的源代码,然后看到头晕也找不到工程-第7页-的入口。其实,uC/OS就是一个库而已,熟悉它的运行流程和函数接口,就可以基本跑起来。在自己亲自移植之前,总是看到移植好的例程包含有CPU、uC-CPU、uC-LIB、uCOS-II四个文件夹下的代码。uCOS-II文件夹下的是源代码,这个好理解;但是前面三个有什么用啊?通常看其他移植教程时,一般都说只需改os_cpu.h,os_cpu_a.asm和os_cpu_c.c就可以了,就没听说过有CPU、uC-CPU、uC-LIB这些的。心中一直很纳闷,难道后三个都要自己编写的吗?后来在上面网址把源代码下载后,才知道CPU、uC-CPU、uC-LIB这三个文件是官方自己写的移植文件,而我们使用了标准外设库CMSIS中提供的启动文件及固件库了,因此可以不用这三个文件,哈哈,心中的疑团解决了!先看一下开发板与uC/OS-II的框架图(注意APP.C就是main文件,我们下面移植的文件并没有APP_VECT.C这个文件,应用文件可以灵活处理的)-第8页--第9页-2、重要文件代码详解移植前,我们需要先了解一下uC/OS的重要文件代码。对于从没接触过uC/OS或者其他嵌入式系统的朋友们,你们需要先了解uC/OS的工作原理和各模块功能,不然就不知道为啥这样移植。推荐教程作者书名推荐理由野火团队初探uCOS-II清晰简单地讲解了uC/OS的运行流程,方便初学者学习。任哲嵌入式实时操作系统uC/OS-II原理及应用(北京航空航天出版社)通俗易懂的一本uC/OS教程,非常适合初学者学习。不过教程没得到更新,不能适应uC/OS的发展,但还是值得推荐。JosephYiu著宋岩译Cortex-M3权威指南呵呵,不用说吧?移植uC/OS到M3内核中,怎么能不了解内核呢?下面的内容主要来自于刚才下载的文件里面的Micrium\AppNotes\AN1xxx-RTOS\AN1018-uCOS-II-Cortex-M3\AN-1018.pdf文件来讲的,因为这文件是uC/OS作者移植uC/OS到STM32的移植手册,里面谈到很多移植说需要注意的事项和相关知识。我在这里添加也按照作者的思路来讲解,并加入个人理解,如果有误,欢迎指出错误。-第10页-2.1os_cpu.h定义数据类型、处理器相关代码、声明函数原型全局变量OS_CPU_GLOBALS和OS_CPU_EXT允许我们是否使用全局变量。1.#ifdefOS_CPU_GLOBALS2.#defineOS_CPU_EXT3.#else//如果没有定义OS_CPU_GLOBALS4.#defineOS_CPU_EXTextern//则用OS_CPU_EXT声明变量已经外部定义了。5.#endif数据类型6.typedefunsignedcharBOOLEAN;7.typedefunsignedcharINT8U;8.typedefsignedcharINT8S;9.typedefunsignedshortINT16U;//大多数Cortex-M3编译器,short是16位,int是32位10.typedefsignedshortINT16S;11.typedefunsignedintINT32U;12.typedefsignedintINT32S;13.typedeffloatFP32;//尽管包含了浮点数,但uC/OS-II中并没用到14.typedefdoubleFP64;15.16.typedefunsignedintOS_STK;//M3是32位,所以堆栈的数据类型OS_STK设置32位17.typedefunsignedintOS_CPU_SR;//M3的状态寄存器(xPSR)是32位临界段临界段,就是不可被中断的代码段,例如常见的入栈出栈等操作就不可被中断。uC/OS-II是一个实时内核,需要关闭中断进入和开中断退出临界段。为此,uC/OS-II定义了两个宏定义来关中断OS_ENTER_CRITICAL()和开中断OS_EXIT_CRITICAL()。18.#defineOS_CRITICAL_METHOD3//进入临界段的三种模式,一般选择第3种,即这里设置为319.20.21.#defineOS_ENTER_CRITICAL(){cpu_sr=OS_CPU_SR_Save();}//进入临界段22.#defineOS_EXIT_CRITICAL(){OS_CPU_SR_Restore(cpu_sr);}//退出临界段-第11页-事实上,有3种开关中断的方法,根据不同的处理器选用不同的方法。大部分情况下,选用第3种方法。另外,关于汇编函数OS_CPU_SR_Save()和OS_CPU_SR_Restore(),在后面谈到os_cpu_a.asm文件时会再说。栈生长方向M3的栈生长方向是由高地址向低地址增长的,因此OS_STK_GROWTH定义为1。23.#defineOS_STK_GROWTH1任务切换宏定义任务切换宏,关于汇编函数OSCtxSw(),在后面谈到os_cpu_a.asm文件时会再说。24.#defineOS_TASK_SW()OSCtxSw()函数原型开中断和关中断如果定义了进入临界段的模式为3,就声明开中断和关中断函数25.#ifOS_CRITICAL_METHOD==326.OS_CPU_SROS_CPU_SR_Save(void);27.voidOS_CPU_SR_Restore(OS_CPU_SRcpu_sr);28.#endif任务管理函数-第12页-29./******************任务切换的函数******************/30.voidOSCtxSw(void);//用户任务切换31.voidOSIntCtxSw(void);//中断任务切换函数32.voidOSStartHighRdy(void);//在操作系统第一次启动的时候调用的任务切换33.34.voidOS_CPU_PendSVHandler(void);//用户中断处理函数,旧版本为OSPendSV35.36.voidOS_CPU_SysTickHandler(void);//系统定时中断处理函数,时钟节拍函数37.voidOS_CPU_SysTickInit(void);//系统SysTick定时器初始化38.39.INT32UOS_CPU_SysTickClkFreq(void);//返回SysTick定时器的时钟频率关于任务切换,利用到异常处理知识,可以看《Cortex-M3权威指南》(JosephYiu著宋岩译)中第3.4小节。关于PendSV,有不懂的朋友,可以看《Cortex-M3权威指南》中第7.6小节SVC和PendSV:SVC(系统服务调用,亦简称系统调用)和PendSV(可悬起系统调用),它们多用在上了操作系统的软件开发中。SVC用于产生系统函数的调用请求,SVC异常是必须在执行SVC指令后立即得到响应的。PendSV(可悬起的系统调用)则不同,它是可以像普通的中断一样被悬起的(不像SVC那样会上访)。OS可以利用它“缓期执行”一个异常——直到其它重要的任务完成后才执行动作。悬起PendSV的方法是:手工往NVIC的PendSV悬起寄存器中写1。悬起后,如果优先级不够高,则将缓期等待执行。PendSV的典型使用场合是在上下文切换时(在不同任务之间切换)。例如,一个系统中有两个就绪的任务,上下文

1 / 76
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功