2014年8月6日DocID025801Rev21/26UM1722用户手册在具有RTOS的STM32Cube上开发应用前言STMCubeTM计划源自意法半导体,旨在通过减少开发的工作量、时间与成本,使开发者受益.
STM32Cube涵盖STM32产品系列.
STM32Cube1.
x版包括:图形软件配置工具STM32CubeMX,可通过图形化的生成初始化C代码.
针对每个系列提供综合的嵌入式软件平台(即STM32CubeF4用于STM32F4系列)–STM32抽象层嵌入式软件STM32CubeHAL,确保在STM32各个产品之间实现最大限度的可移植性–一套一致的中间件,比如RTOS、USB、TCP/IP、图形–所有嵌入式软件实用工具均配备一套完整的示例.
实时操作系统是为在嵌入式/实时应用中使用而优化的操作系统.
它们的主要目标是确保及时、确定性地响应事件.
使用实时操作系统,应用可写为一组独立的线程,线程间使用消息队列和信号量通信.
本用户手册的目标读者为在STM32微控制器上使用STM32Cube固件的开发者.
它完整描述了如何使用具有实时操作系统(RTOS)的STM32Cube固件组件;本用户手册还提供了一组示例说明,它们基于FreeRTOS,使用CMSIS-OS封装层提供的通用API.
在STM32Cube固件中,通过ARM提供的通用CMSIS-OS封装层,将FreeRTOS用作实时操作系统.
使用FreeRTOS的样例和应用可直接移植到其它任何RTOS而不需要修改高层API,在此情况下仅需更改CMSIS-OS封装.
请参考软件包的发布说明,以了解与STM32CubeTM共同使用的FreeRTOS和CMSIS-RTOS固件组件版本.
本文档适用于所有STM32器件;然而为了简洁起见,以STM32F4xx器件和STM32CubeF4作为参考平台.
若需了解更多在STM32设备上样例实现的信息,请参考相关STM32Cube固件包中提供的自述文件.
www.
st.
com目录UM17222/26DocID025801Rev2目录1FreeRTOS51.
1概述51.
2授权61.
3FreeRTOS源代码组织71.
4将FreeRTOS移植到STM3271.
5FreeRTOSAPI81.
6FreeRTOS存储器管理91.
7FreeRTOS低功耗101.
8FreeRTOS配置112CMSIS-RTOS模块122.
1概述122.
2CMSIS-RTOSAPI133FreeRTOS应用163.
1线程创建示例163.
2信号量示例173.
2.
1线程间信号量173.
2.
2从ISR得到信号量183.
3互斥量示例193.
4队列示例193.
5定时器示例203.
6低功耗示例214结论235FAQ246修订历史25DocID025801Rev23/26UM1722表格索引3表格索引表1.
FreeRTOSAPI.
8表2.
CMSIS-RTOSAPI13表3.
FreeRTOS应用类别16表4.
功耗比较22表5.
文档修订历史25图片索引UM17224/26DocID025801Rev2图片索引图1.
FreeRTOS许可6图2.
FreeRTOS架构7图3.
FreeRTOS移植7图4.
FreeRTOS配置11图5.
CMSIS-RTOS架构12图6.
线程示例17图7.
信号量示例18图8.
从ISR得到信号量18图9.
队列过程20图10.
周期性定时器21DocID025801Rev25/26UM1722FreeRTOS251FreeRTOS1.
1概述FreeRTOS是RTOS的一种,尺寸非常小,可运行于微控制器上,但其使用并不限于微控制器应用.
微控制器是尺寸小、资源受限的处理器,它在单个芯片上包含了处理器本身、用于保存要执行的程序的只读存储器(ROM或Flash)、所执行程序需要的随机存取存储器(RAM).
一般情况下,程序直接从只读存储器执行.
微控制器用于深度嵌入式应用(对于那些应用,您永远不会看到处理器本身或运行的软件),它们一般有非常明确、专门的工作.
尺寸的限制以及专用的终端应用等性质,令其很少能使用完整的RTOS实现-或者说不可能使用完整的RTOS实现.
因此,FreeRTOS仅为内核提供了实时调度功能、任务间通信、时序和同步原语.
这意味着更准确地说,它是一个实时内核,或实时执行器.
命令控制台界面、网络栈等额外的功能可作为附加组件.
FreeRTOS为可调整的实时示例生成器内核,专为小型嵌入式系统设计.
其特点包括FreeRTOS示例生成器内核——优先式、合作式及混合式配置选项.
官方支持27种架构(ARM7和ARMCortexM3每个算一种架构).
FreeRTOS-MPU支持CortexM3存储器保护单元(MPU).
设计目标为小尺寸、简单和易用.
一般来说,示例生成器内核二进制映像大约为4K到9K字节.
代码结构极易移植,主要用C编写.
支持任务和协同例程.
可通过队列、二进制信号量、计数信号量、递归信号量、互斥量在任务间、任务与中断间通信和同步.
互斥量有优先级继承.
支持高效的软件定时器.
强大的执行跟踪功能.
栈溢出检测选项.
预配置的示例应用,用于选定的单板电脑,可直接使用,加快学习曲线.
免费论坛支持,或可选择商业支持和授权.
可创建的任务数无软件限制.
可使用的优先级数无软件限制.
优先级指定无限制-可为多个任务指定同一优先级.
免费的开发工具可用于很多支持的架构.
免费的嵌入式软件源代码.
免版税.
可从标准的Windows主机交叉开发.
FreeRTOSUM17226/26DocID025801Rev2FreeRTOS的heap2方案用于内存分配管理,此方案使用最佳适用算法释放之前分配的块.
然而,它不会将相邻的自由块合并为一个大块.
可用的RAM总量通过定义configTOTAL_HEAP_SIZE设置-定义于FreeRTOSConfig.
h中.
1.
2授权FreeRTOS源代码使用修正的GNU通用公开许可来授权.
该修正使用了除外形式.
GNU通用公开许可全文如下:图1.
FreeRTOS许可7KH)UHH5726RUJVRXUFHFRGHLVOLFHQVHGE\WKHPRGLILHG*18*HQHUDO3XEOLF/LFHQVH*3/WH[WSURYLGHGEHORZ7KH)UHH5726GRZQORDGDOVRLQFOXGHVGHPRDSSOLFDWLRQVRXUFHFRGHVRPHRIZKLFKLVSURYLGHGE\WKLUGSDUWLHV$1',6/,&(16('6(3$5$7(/externuint32_tSystemCoreClock;#endif#defineconfigUSE_PREEMPTION1#defineconfigUSE_IDLE_HOOK0#defineconfigUSE_TICK_HOOK0#defineconfigCPU_CLOCK_HZ(SystemCoreClock)#defineconfigTICK_RATE_HZ((portTickType)1000)#defineconfigMAX_PRIORITIES((unsignedportBASE_TYPE)7)#defineconfigMINIMAL_STACK_SIZE((unsignedshort)128)#defineconfigTOTAL_HEAP_SIZE((size_t)(15*1024))#defineconfigMAX_TASK_NAME_LEN(16)#defineconfigUSE_TRACE_FACILITY1#defineconfigUSE_16_BIT_TICKS0#defineconfigIDLE_SHOULD_YIELD1#defineconfigUSE_MUTEXES1#defineconfigQUEUE_REGISTRY_SIZE8#defineconfigCHECK_FOR_STACK_OVERFLOW0#defineconfigUSE_RECURSIVE_MUTEXES1#defineconfigUSE_MALLOC_FAILED_HOOK0#defineconfigUSE_APPLICATION_TASK_TAG0#defineconfigUSE_COUNTING_SEMAPHORES1/*Cortex-Mspecificdefinitions.
*/#ifdef__NVIC_PRIO_BITS/*__BVIC_PRIO_BITSwillbespecifiedwhenCMSISisbeingused.
*/#defineconfigPRIO_BITS__NVIC_PRIO_BITS#else#defineconfigPRIO_BITS4/*15prioritylevels*/#endif/*Thelowestinterruptprioritythatcanbeusedinacalltoa"setpriority"function.
*/#defineconfigLIBRARY_LOWEST_INTERRUPT_PRIORITY0xf/*ThehighestinterruptprioritythatcanbeusedbyanyinterruptserviceroutinethatmakescallstointerruptsafeFreeRTOSAPIfunctions*/#defineconfigLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY5/*Interruptprioritiesusedbythekernelportlayeritself.
ThesearegenerictoallCortex-Mports,anddonotrelyonanyparticularlibraryfunctions.
*/#defineconfigKERNEL_INTERRUPT_PRIORITY(configLIBRARY_LOWEST_INTERRUPT_PRIORITY>>FreeRTOS应用UM172218/26DocID025801Rev2图7.
信号量示例信号量创建说明:/*定义信号量*/osSemaphoreDef(SEM);/*创建二进制信号量*/osSemaphoreIdosSemaphore=osSemaphoreCreate(osSemaphore(SEM),1);使用此例:1.
生成应用代码并编程至STM32闪存2.
运行样例,检查LED是否如图7中描述的一样切换.
3.
2.
2从ISR得到信号量本例演示了怎样使用来自中断的信号量.
它包含了一个基本线程,无限等待信号量切换LED.
当用户按评估板的KEY按钮后,STM32会生成中断,信号量被释放.
图8.
从ISR得到信号量使用此例1.
生成应用代码并编程至STM32闪存2.
运行样例,检查当按评估板的KEY按钮时,LED1是否会切换.
喋倄ф喌/('喋ф喌喏/('ふ/('喋喌RV6HPDSKRUH:DLW喋喌RV6HPDSKRUH:DLWRV6HPDSKRUH:DLW喋喌喋喌RV6HPDSKRUH:DLWRV6HPDSKRUH5HOHDVHRV6HPDSKRUH5HOHDVHDocID025801Rev219/26UM1722FreeRTOS应用253.
3互斥量示例互斥量是包含了优先级继承机制的二进制信号量.
二进制信号量更适合于实现同步(在任务之间,或在任务和中断之间),而互斥量更适合于实现简单的互斥.
本例创建了三个具有不同优先级的线程,它们访问同一个互斥量.
1.
高优先级线程首先执行,抢占互斥量,然后短时间睡眠,让更低的优先级线程执行.
2.
中优先级线程通过执行阻塞"wait",尝试访问互斥量.
当互斥量已经被高优先级线程得到时,此线程阻塞.
直到高优先级线程释放互斥量,它才解除阻塞,实际上直到高优先级线程挂起自己,它才会运行.
3.
低优先级线程一直紧凑循环,尝试使用非阻塞调用得到互斥量.
因为它是最低优先级的线程,所以直到高、中优先级线程挂起,它才会成功得到互斥量.
4.
高优先级线程在挂起自己之前归还互斥量.
5.
中优先级线程得到互斥量,它所做的也仅是在挂起自己之前归还互斥量.
此刻,高、中优先级线程都已挂起.
6.
低优先级线程得到互斥量,它首先在归还互斥量之前继续两个挂起的线程,因此低优先级线程暂时继承了最高线程优先级.
互斥量创建说明:/*定义互斥量*/osMutexDef(osMutex);/*创建互斥量*/osMutexIdosMutex=osMutexCreate(osMutex(osMutex));使用此例:1.
生成应用代码并编程至STM32闪存2.
当运行于调试模式时,请将下述变量添加到调试器的实时监测:HighPriorityThreadCycles、MediumPriorityThreadCycles和LowPriorityThreadCycles;这三个变量必须保持相等.
LED1、LED2和LED4应无限切换,LED3仅在错误时打开3.
4队列示例队列是任务间通信的主要形式.
可使用队列在任务间、在中断与任务间传递消息.
在多数时候,它们作为线程安全的FIFO(先进先出)缓冲使用,新数据发送到队尾,有时也可发送到队头.
本例创建了两个线程,它们向队列发送/从队列接收递增的数.
一个线程作为生产者,另一个线程作为消费者.
消费者的优先级比生产者高,设置为读队列时阻塞.
队列空间仅能容纳一个对象,一旦生产者向队列发布了一条消息,消费者将解除阻塞,抢占生产者运行,删除该对象.
FreeRTOS应用UM172220/26DocID025801Rev2图9.
队列过程队列创建说明:/*定义队列,"QUEUE_SIZE"项为2个字节*/osMessageQDef(osqueue,QUEUE_SIZE,uint16_t);/*创建队列*/osMessageQIdosQueue=osMessageCreate(osMessageQ(osqueue),NULL);使用此例:1.
生成应用代码并编程至STM32闪存2.
运行该例,检查LED1是否在收到每条正确消息时切换,否则LED3切换.
3.
5定时器示例定时器可令函数在未来某设定时间执行.
由定时器执行的函数称为定时器的回调函数.
从定时器启动到回调函数执行之间的时间称为定时器的周期.
简单地说,当定时器周期结束时,执行回调函数.
本例演示了怎样基于FreeRTOSAPI使用CMSISRTOSAPI定时器,创建的周期性定时器每隔200毫秒调用一次回调函数,切换评估板的LED1.
喋喌喋喌RV0HVVDJH3XW喋喌RV0HVVDJH3XWRV0HVVDJH*HW喋喌RV0HVVDJH*HWDocID025801Rev221/26UM1722FreeRTOS应用25图10.
周期性定时器周期性定时器创建说明:/*定义一个定时器,"osTimerCallback"为其回调过程*/osTimerDef(LEDTimer,osTimerCallback);/*创建定时器*/osTimerIdosTimer=osTimerCreate(osTimer(LEDTimer),osTimerPeriodic,NULL);使用此例:1.
生成应用代码并编程至STM32闪存2.
运行此列,检查LED1是否每200毫秒(定时器周期结束)切换一次注:若要使用FreeRTOS软件定时器,请将"timers.
c"添加到您的项目工作空间.
3.
6低功耗示例本例演示了如何在低功耗模式下使用STM32设备运行FreeRTOS(若需FreeRTOS低功耗模式的更多信息,请参考第1.
7章节).
在FreeRTOSConfig.
h中,将configUSE_TICKLESS_IDLE定义为1,即可启用内置的无时间片空闲功能(低功耗)在本例中创建了两个线程和一个队列,它们具有下列功能:第一个线程"RxThread"阻塞于队列,等待数据,每次收到数据时切换LED(打开然后关闭),然后再次返回到阻塞于队列的状态.
第二个线程"TxThread"重复进入阻塞状态500ms.
当离开阻塞状态时,"TxThread"通过队列向"RxThread"发送一条消息(导致"RxThread"离开阻塞状态,切换LED).
当这两个线程阻塞时,内核停止时间片中断,将STM32置于低功耗(睡眠)模式以降低功耗.
表4显示了在所述的样例情况下,STM32F4设备上测得的功耗.
喋喌FreeRTOS应用UM172222/26DocID025801Rev2表4.
功耗比较硬件平台运行时模式睡眠模式STM324xG-EVAL62.
4mA14.
2mASTM324x9I-EVAL80.
5mA20.
8mADocID025801Rev223/26UM1722结论254结论本用户手册解释了如何在STM32CubeHAL驱动内集成FreeRTOS中间件组件.
本文说明了一组样例,以帮助用户基于FreeRTOS操作系统使用CMSIS-RTOSAPI开发应用.
FAQUM172224/26DocID025801Rev25FAQ怎样将FreeRTOS移植到不同的Cortex-M内核若需将FreeRTOS移植到正确的Cortex-M产品,您必须从正确的目录导入"port.
c".
例如,若微控制器是带有IAR工具的Cortex-M0内核,则您必须从"FreeRTOS\Source\portable\IAR\ARM_CM0"获取port.
c.
FreeRTOS使用多少ROM/RAM这取决于您的编译器、架构,以及RTOS内核配置.
一般来说,RTOS内核本身需要大约5到10K字节ROM空间.
如果创建的线程或队列数增加,RAM使用量就会上升.
怎样设置CPU时钟CPU时钟由FreeRTOSConfig.
h中的configCPU_CLOCK_HZ定义,在STM32CubeF4固件内它由SystemCoreClock提供,表示HCLK时钟(AHB总线),当通过调用SystemClock_Config()函数配置RCC时钟时会设置此值.
怎样设置中断优先级任何使用RTOSAPI函数的中断服务程序,其优先级必须手动设置为大于等于FreeRTOSConfig.
h文件中configMAX_SYSCALL_INTERRUPT_PRIORITY的设置值.
这确保了中断的逻辑优先级小于等于configMAX_SYSCALL_INTERRUPT_PRIORITY设置.
怎样使用非SysTick时钟生成时间片中断用户可选择性地自己提供时间片中断源,方法是使用非SysTick的定时器生成中断:提供vPortSetupTimerInterrupt()的实现,它会以configTICK_RATE_HZFreeRTOSConfig.
h常量指定的频率生成中断.
将xPortSysTickHandler()安装为定时器中断的处理程序,确保xPortSysTickHandler()在FreeRTOSConfig.
h中未映射至SysTick_Handler(),且在port.
c中未重命名为SysTick_Handler().
怎样启用无时间片空闲模式FreeRTOS无时间片模式(低功耗)通过进入睡眠模式并停止周期性的时间片中断来降低MCU功耗.
在FreeRTOSConfig.
h中,将configUSE_TICKLESS_IDLE定义为1,即可启用此功能当使用非SysTick定时器生成时间片中断时,也可启用无时间片空闲模式.
用户必须添加下列动作至上一个问题所述内容:在FreeRTOSConfig.
h中,将configUSE_TICKLESS_IDLE设为2.
按FreeRTOS网站的文档页面说明,定义portSUPPRESS_TICKS_AND_SLEEP().
DocID025801Rev225/26UM1722修订历史256修订历史表5.
文档修订历史日期修订变更2014年2月18日1初始版本.
2014年6月23日2封面更新:–文件标题–参照STM32Cube中的STM32CubeF4UM172226/26DocID025801Rev2请仔细阅读:中文翻译仅为方便阅读之目的.
该翻译也许不是对本文档最新版本的翻译,如有任何不同,以最新版本的英文原版文档为准.
本文档中信息的提供仅与ST产品有关.
意法半导体公司及其子公司("ST")保留随时对本文档及本文所述产品与服务进行变更、更正、修改或改进的权利,恕不另行通知.
所有ST产品均根据ST的销售条款出售.
买方自行负责对本文所述ST产品和服务的选择和使用,ST概不承担与选择或使用本文所述ST产品和服务相关的任何责任.
无论之前是否有过任何形式的表示,本文档不以任何方式对任何知识产权进行任何明示或默示的授权或许可.
如果本文档任何部分涉及任何第三方产品或服务,不应被视为ST授权使用此类第三方产品或服务,或许可其中的任何知识产权,或者被视为涉及以任何方式使用任何此类第三方产品或服务或其中任何知识产权的保证.
除非在ST的销售条款中另有说明,否则,ST对ST产品的使用和/或销售不做任何明示或默示的保证,包括但不限于有关适销性、适合特定用途(及其依据任何司法管辖区的法律的对应情况),或侵犯任何专利、版权或其他知识产权的默示保证.
意法半导体的产品不得应用于武器.
此外,意法半导体产品也不是为下列用途而设计并不得应用于下列用途:(A)对安全性有特别要求的应用,例如,生命支持、主动植入设备或对产品功能安全有要求的系统;(B)航空应用;(C)汽车应用或汽车环境,且/或(D)航天应用或航天环境.
如果意法半导体产品不是为前述应用设计的,而采购商擅自将其用于前述应用,即使采购商向意法半导体发出了书面通知,采购商仍将独自承担因此而导致的任何风险,意法半导体的产品设计规格明确指定的汽车、汽车安全或医疗工业领域专用产品除外.
根据相关政府主管部门的规定,ESCC、QML或JAN正式认证产品适用于航天应用.
经销的ST产品如有不同于本文档中提出的声明和/或技术特点的规定,将立即导致ST针对本文所述ST产品或服务授予的任何保证失效,并且不应以任何形式造成或扩大ST的任何责任.
ST和ST徽标是ST在各个国家或地区的商标或注册商标.
本文档中的信息取代之前提供的所有信息.
ST徽标是意法半导体公司的注册商标.
其他所有名称是其各自所有者的财产.
2014STMicroelectronics保留所有权利意法半导体集团公司澳大利亚-比利时-巴西-加拿大-中国-捷克共和国-芬兰-法国-德国-中国香港-印度-以色列-意大利-日本-马来西亚-马耳他-摩洛哥–菲律宾–新加坡-西班牙-瑞典-瑞士-英国-美国www.
st.
com
快快云怎么样?快快云是一家成立于2021年的主机服务商,致力于为用户提供高性价比稳定快速的主机托管服务,快快云目前提供有香港云服务器、美国云服务器、日本云服务器、香港独立服务器、美国独立服务器,日本独立服务器。快快云专注为个人开发者用户,中小型,大型企业用户提供一站式核心网络云端服务部署,促使用户云端部署化简为零,轻松快捷运用云计算!多年云计算领域服务经验,遍布亚太地区的海量节点为业务推进提供强大...
digital-vm怎么样?digital-vm在今年1月份就新增了日本、新加坡独立服务器业务,但是不知为何,期间终止了销售日本服务器和新加坡服务器,今天无意中在webhostingtalk论坛看到Digital-VM在发日本和新加坡独立服务器销售信息。服务器硬件是 Supermicro、采用最新一代 Intel CPU、DDR4 RAM 和 Enterprise Samsung SSD内存,默认...
快快CDN主营业务为海外服务器无须备案,高防CDN,防劫持CDN,香港服务器,美国服务器,加速CDN,是一家综合性的主机服务商。美国高防服务器,1800DDOS防御,单机1800G DDOS防御,大陆直链 cn2线路,线路友好。快快CDN全球安全防护平台是一款集 DDOS 清洗、CC 指纹识别、WAF 防护为一体的外加全球加速的超强安全加速网络,为您的各类型业务保驾护航加速前进!价格都非常给力,需...
免费论坛为你推荐
操作http目录盐城市第八届人大常委会第五次会议纪要iproute网关怎么设置?asp.net空间哪里可以申请asp空间的?360邮箱360免费申请邮箱在那里ipad代理想买个ipad买几代性价比比较高govya腾讯公司电话是多少腾讯公司电话是多少tumblr上不去吃鸡更新完打不开,成这样了,怎么办在线等,挺急的400电话查询400电话号码可以查询归属地吗?办理400电话是不是很贵?
花生壳域名 域名服务dns的主要功能为 3322动态域名 z.com isatap 权嘉云 bgp双线 699美元 isp服务商 美国堪萨斯 100mbps idc查询 流媒体加速 架设邮件服务器 中国电信网络测速 贵阳电信测速 深圳域名 金主 SmartAXMT800 register.com 更多