你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

FreeRTOS STM32f10系列简单移植

[复制链接]
ajane 发布时间:2015-1-5 22:58
1.前言
    【1】其实说不上移植笔记,FreeRTOS已经移植至众多平台(MCU),包括MSP430,STM32等,这份笔记完全建立在官方代码的基础之上,简单的说就是修改一些设置从而完成一个呼吸灯实验。
    【2】虽然有官方移植代码,但是官方移植版本为STM32的V2.X库,与现在流行的V3.5有比较大的区别。本笔记也是总结网上几篇学习笔记,主要说明如果使用V3.5库,需要做哪些修改。
    【3】编译软件为IAR EWARM 6.5。

    【相关博文】
    【FreeRTOS学习笔记——任务间使用队列同步数据】——如何使用FreeRTOS队列。
    【如何在FreeRTOS下实现低功耗——MSP430F5438平台】——如何通过空任务实现系统低功耗。



2.FreeRTOS需要哪些文件    FreeRTOS的文件结构非常简单,移植或者版本升级替换也非常方便。
    1)与FreeRTOS内核有关的文件数量仅为3个,分别是list.c queue.c tasks.c
    该文件位于FreeRTOS\Source
    2)与内存分配有关的文件共有4个,分别是heap_1.c,heap_2.c,heap_3.c,heap_4.c。4个文件只需选择其中的1个,STM32选择heap_2.c。
    该文件位于FreeRTOS\Source\portable\MemMang
    3)与移植相关的代码包括port.c,portasm.s,portmacro.h。这些代码不但和编译器有关还和平台(MCU)有关。FreeRTOS先以编译器为大类,然后再以平台(MCU)为小类。在这里选择IAR编译器,平台为ARM_CM3。
    该文件位于FreeRTOS\Source\portable\IAR\ARM_CM3
    4)除了上述内容之外,还包括FreeRTOS内核相关的头文件。
    该文件FreeRTOS\Source\include

3.必要的工程设置    开始之前需要引入V3.5库相关头文件,启动代码和CMSIS库。
    在IAR中设置相关头文件的路径(应根据实际情况修改)
    $PROJ_DIR$\CMSIS
    $PROJ_DIR$\StdPeriph_Driver\inc
    $PROJ_DIR$\User
    $PROJ_DIR$\FreeRTOS\Source\include
    $PROJ_DIR$\FreeRTOS\Source\portable\IAR\ARM_CM3
    当然头文件的路径并不是绝对的,只要明确头文件在哪,设置正确路径即可。
    除了设置C代码的相关头文件之外,还需要设置汇编代码的头文件路径,由于很少设置汇编代码头文件路径,往往初次移植FreeRTOS会在此处遇到一些“困难”。(当然也包括我)
    由于portasm.s需要FreeRTOSConfig.h中的相关宏定义,所以要根据FreeRTOSConfig.h的位置来设置汇编代码的头文件路径,本例中FreeRTOSConfig.h位于User文件夹,所以设置如下图所示。
20131026220530093.png
4.修改启动代码    由于SVC_Handle,PendSV_Handle和SysTick_Handle在portasm.s中被重定义,所以需要在启动代码中修改这些中断向量的名称,并声明这些中断向量为外部函数。这也是初次使用FreeRTOS容易范的错误。具体修改如下所示。
20131026220537156.png
请注意,在汇编代码中";"代表注释。EXTERN和C语言的extern含义相同——意为外部函数(变量)。
    EXTERN  __iar_program_start
    EXTERN  SystemInit   
    EXTERN  vPortSVCHandler           ;@
    EXTERN  xPortPendSVHandler        ;@
    EXTERN  xPortSysTickHandler       ;@
    PUBLIC  __vector_table
    声明vPortSVCHandler,xPortPendSVHandler和xPortSysTickHandler为外部函数。
    vPortSVCHandler对应SVC_Handler
    xPortPendSVHandler对应PendSV_Handle
    xPortSysTickHandle对应SysTick_Handle

5.代码实现    经过了以上修改之后,就可以轻松实现基于FreeRTOS的呼吸灯了。代码如下:

  1. /* Standard includes. */
  2. #include <stdio.h>

  3. /* Scheduler includes. */
  4. #include "FreeRTOS.h"
  5. #include "task.h"
  6. #include "queue.h"

  7. /* Library includes. */
  8. #include "stm32f10x.h"

  9. #define LED0_ON()   GPIO_SetBits(GPIOB,GPIO_Pin_0);
  10. #define LED0_OFF()  GPIO_ResetBits(GPIOB,GPIO_Pin_0);

  11. static void prvSetupHardware( void );
  12. static void vLEDTask( void *pvParameters );
  13. void vLedInit(void);

  14. int main( void )
  15. {
  16.   /* 初始化硬件平台 */
  17.   prvSetupHardware();
  18.   /* 建立任务 */
  19.   xTaskCreate( vLEDTask, ( signed portCHAR * ) "LED", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+3, NULL );
  20.   /* 启动OS */
  21.   vTaskStartScheduler();
  22.   
  23.   return 0;
  24. }
  25. /*-----------------------------------------------------------*/
  26. void vLEDTask( void *pvParameters )
  27. {
  28.   for( ;; )
  29.   {
  30.     LED0_ON();
  31.     vTaskDelay( 100/portTICK_RATE_MS );
  32.     LED0_OFF();
  33.     vTaskDelay( 100/portTICK_RATE_MS );
  34.   }
  35. }

  36. /*-----------------------------------------------------------*/
  37. static void prvSetupHardware( void )
  38. {
  39.   vLedInit();
  40. }
  41. /*-----------------------------------------------------------*/
  42. void vLedInit( void )
  43. {
  44.   GPIO_InitTypeDef GPIO_InitStructure;
  45.   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
  46.   /*LED0 @ GPIOB.0*/
  47.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  48.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  49.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  50.   GPIO_Init( GPIOB, &GPIO_InitStructure );   
  51. }
复制代码




收藏 1 评论9 发布时间:2015-1-5 22:58

举报

9个回答
w小菜才 回答时间:2015-1-5 23:08:40
我现在M3还不会呢,只记录一下吧

AN023_PS081 太阳能人体秤应用指南.pdf

下载

5.84 MB, 下载次数: 9

wfmjj 回答时间:2015-1-6 00:04:20
我有一篇写得很详细! 在mdk中移植FreeRTOSV8.0.0.pdf (937.98 KB, 下载次数: 28)
feixiang20 回答时间:2015-1-6 01:19:02
最好是自己写的笔记
党国特派员 回答时间:2015-1-6 01:20:08
很不错,谢谢。
qzwx741 回答时间:2015-1-6 08:23:36
谢谢,下载了
ataudio 回答时间:2015-1-12 09:03:11
好文好经验。学习分享。
火蒂树 回答时间:2015-1-13 00:36:16
很有技术含量啊
smcdh 回答时间:2015-1-13 07:25:51
不错,先下栽了
shilinma 回答时间:2015-1-14 19:16:45
很不错,谢谢。很不错,谢谢。

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版