社区导航

 

搜索
查看: 1252|回复: 2

[原创] MM32F031开发板评测 003 之 FreeRTOS移植

[复制链接]

298

TA的帖子

1

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-11-9 21:46 | 显示全部楼层 |阅读模式
本帖最后由 hotsauce1861 于 2018-11-10 12:59 编辑

最近比较忙,因为各种忙,导致有点过劳胖了,所以还是要注意身体啊。
MM32的评测停了一段时间,因为硬件上不太熟悉,而且坛子的大牛们都已经评测的比较详细了,看完之后,我也是受益匪浅。
然后感觉可以移植一个操作系统上去试试水,考虑各种因素,决定移植FreeRTOS跑跑看。

捣鼓了一个晚上,差不多搞定最基本最纯净的系统移植了,后面看情况再移植一个CLI上去试试。

有兴趣的童鞋可以自己试试看哦,有什么问题可以一起交流一下。网上的教程比较多,参考STM32F103其实也可以的。
不过官方有给出教程,源码里面也有很多Demo了,参考Demo去改,其实也差不多了。
官方的移植教程链接地址 https://www.freertos.org/porting ... erent-hardware.html
源码下载链接 https://www.freertos.org/FreeRTOS-quick-start-guide.html

移植所需要做的工作简单总结一下:
1 FreeRTOSConfig.h
这个文件可以在源码的FreeRTOSv10.1.1\FreeRTOS\Demo\CORTEX_M0_STM32F0518_IAR\FreeRTOSConfig.h 拷贝过来
2 prot.c  portmacro.h
源码路径下FreeRTOSv10.1.1\FreeRTOS\Source\portable\RVDS\ARM_CM0
如果是其他编译器的话,需要另行选择的,Keil则使用RVDS下的文件

遇到的问题:
移植一切都很顺利,后来发现任务调度上,定时器并没有起到作用,在port.cprvSetupTimerInterrupt函数重新初始化了sys_tick一切正常了,
源码里的修改不是很清蒸,烦恼,可能是有个宏定义出问题了,详情请看代码
main.c 中写了一个测试例程,
两个任务,
1 亮灯任务优先级低,任务开始后亮灯并堵塞500毫秒
2 灭灯任务优先级高,会抢占CPU,然后灭灯,堵塞1000毫秒并交出CPU使用权
亮灯任务堵塞结束后,重新获取CPU使用权,然后重新点亮LED。
所以main.c就是一个间隔500毫秒的LED灯闪烁程序。

,贴一下代码吧,这样显得文章比较长


  1. #include "FreeRTOS.h"
  2. #include "task.h"
  3. #include "delay.h"
  4. #include "sys.h"
  5. #include "led.h"
  6. #include "HAL_gpio.h"

  7. #define STACK_SIZE                                                                128

  8. #define LED_OFF()                 do {GPIO_SetBits(GPIOA,GPIO_Pin_8);}while(0)
  9. #define LED_ON()                  do {GPIO_ResetBits(GPIOA,GPIO_Pin_8);}while(0)
  10. #define LED_TOGGLE()                                                  do {(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8)) \
  11.                                                                                                                                         ?(GPIO_ResetBits(GPIOA,GPIO_Pin_8)) \
  12.                                                                                                                                         :(GPIO_SetBits(GPIOA,GPIO_Pin_8));} while(0)

  13. void prvSetupHardware(void);
  14.                                                                                                                                        
  15. void vCreateFlashTasks(void);                                                                                                                                
  16. void vTaskCodeLEDON( void * pvParameters );                                                                                                                                       
  17. void vTaskCodeLEDOFF( void * pvParameters );
  18.                                                                                                                                        
  19. int main( void )
  20. {
  21.    /* Setup the microcontroller hardware for the demo. */
  22.    prvSetupHardware();

  23.    /* Leave this function. */
  24.    vCreateFlashTasks();

  25.    /*Start the RTOS scheduler. */
  26.    vTaskStartScheduler();

  27.    /* Should never get here! */
  28. }

  29. void prvSetupHardware(void){
  30.         

  31.     GPIO_InitTypeDef  GPIO_InitStructure;
  32.    
  33.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  34.     GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_8;
  35.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  36.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  37.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  38.                 LED_OFF();
  39.                 //System_Clock_Init(6);
  40.                 //delay_init();
  41.                 //LED_ON();
  42. }
  43. #if 1
  44. void vCreateFlashTasks(void){
  45.         
  46.                 BaseType_t xReturned;
  47.                 TaskHandle_t xHandle = NULL;

  48.     /* Create the task, storing the handle. */
  49.     xReturned = xTaskCreate(
  50.                     vTaskCodeLEDON,       /* Function that implements the task. */
  51.                     "LEDON",          /* Text name for the task. */
  52.                     STACK_SIZE,      /* Stack size in words, not bytes. */
  53.                     ( void * ) 1,    /* Parameter passed into the task. */
  54.                     tskIDLE_PRIORITY + 1,/* Priority at which the task is created. */
  55.                     &xHandle );      /* Used to pass out the created task's handle. */
  56.                                                                                 
  57.                                                                                 
  58.     /* Create the task, storing the handle. */
  59.     xReturned = xTaskCreate(
  60.                     vTaskCodeLEDOFF,       /* Function that implements the task. */
  61.                     "LEDOFF",          /* Text name for the task. */
  62.                     STACK_SIZE,      /* Stack size in words, not bytes. */
  63.                     ( void * ) 1,    /* Parameter passed into the task. */
  64.                     tskIDLE_PRIORITY + 2,/* Priority at which the task is created. */
  65.                     &xHandle );      /* Used to pass out the created task's handle. */                        
  66.                                                                                 
  67.     if( xReturned == pdPASS )
  68.     {
  69.         /* The task was created.  Use the task's handle to delete the task. */
  70.         //vTaskDelete( xHandle );
  71.     }
  72.         
  73. }
  74. /* Task to be created. */
  75. void vTaskCodeLEDOFF( void * pvParameters )
  76. {
  77.     /* The parameter value is expected to be 1 as 1 is passed in the
  78.     pvParameters value in the call to xTaskCreate() below.
  79.     configASSERT( ( ( uint32_t ) pvParameters ) == 1 );
  80.                 */
  81.                 const TickType_t xDelay = 500 / portTICK_PERIOD_MS;
  82.     for( ;; )
  83.     {                        
  84.                         LED_ON();        
  85.                         vTaskDelay(xDelay);
  86.     }
  87. }

  88. /* Task to be created. */
  89. void vTaskCodeLEDON( void * pvParameters )
  90. {
  91.     /* The parameter value is expected to be 1 as 1 is passed in the
  92.     pvParameters value in the call to xTaskCreate() below.
  93.     configASSERT( ( ( uint32_t ) pvParameters ) == 1 );
  94.                 */
  95.                 const TickType_t xDelay = 1000 / portTICK_PERIOD_MS;
  96.                 //LED_ON();
  97.     for( ;; )
  98.     {                        
  99.                         /* Task code goes here. */
  100.                         LED_OFF();        
  101.                         vTaskDelay(xDelay);

  102.     }
  103. }
  104. #endif
复制代码




Demo的地址
https://github.com/hotsauce1861/MM32_FreeRTOS.git




MM32_FreeRTOS.zip

9.2 MB, 下载次数: 2842

回复可见



回复

使用道具 举报

1382

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-11-12 08:48 | 显示全部楼层
不错,帅!
专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void


回复

使用道具 举报

298

TA的帖子

1

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-11-12 10:31 | 显示全部楼层


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/8 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-5-25 05:17 , Processed in 0.148558 second(s), 23 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表