hotsauce1861 发表于 2018-11-9 21:46

MM32F031开发板评测 003 之 FreeRTOS移植

<div class='showpostmsg'> 本帖最后由 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.cportmacro.h
源码路径下FreeRTOSv10.1.1\FreeRTOS\Source\portable\RVDS\ARM_CM0
如果是其他编译器的话,需要另行选择的,Keil则使用RVDS下的文件

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

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


#include "FreeRTOS.h"
#include "task.h"
#include "delay.h"
#include "sys.h"
#include "led.h"
#include "HAL_gpio.h"

#define STACK_SIZE                                                                128

#define LED_OFF()               do {GPIO_SetBits(GPIOA,GPIO_Pin_8);}while(0)
#define LED_ON()                  do {GPIO_ResetBits(GPIOA,GPIO_Pin_8);}while(0)
#define LED_TOGGLE()                                                do {(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8)) \
                                                                                                                                        ?(GPIO_ResetBits(GPIOA,GPIO_Pin_8)) \
                                                                                                                                        :(GPIO_SetBits(GPIOA,GPIO_Pin_8));} while(0)

void prvSetupHardware(void);
                                                                                                                                       
void vCreateFlashTasks(void);                                                                                                                              
void vTaskCodeLEDON( void * pvParameters );                                                                                                                                       
void vTaskCodeLEDOFF( void * pvParameters );
                                                                                                                                       
int main( void )
{
   /* Setup the microcontroller hardware for the demo. */
   prvSetupHardware();

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

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

   /* Should never get here! */
}

void prvSetupHardware(void){
      

    GPIO_InitTypeDefGPIO_InitStructure;
   
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
                LED_OFF();
                //System_Clock_Init(6);
                //delay_init();
                //LED_ON();
}
#if 1
void vCreateFlashTasks(void){
      
                BaseType_t xReturned;
                TaskHandle_t xHandle = NULL;

    /* Create the task, storing the handle. */
    xReturned = xTaskCreate(
                  vTaskCodeLEDON,       /* Function that implements the task. */
                  "LEDON",          /* Text name for the task. */
                  STACK_SIZE,      /* Stack size in words, not bytes. */
                  ( void * ) 1,    /* Parameter passed into the task. */
                  tskIDLE_PRIORITY + 1,/* Priority at which the task is created. */
                  &xHandle );      /* Used to pass out the created task's handle. */
                                                                              
                                                                              
    /* Create the task, storing the handle. */
    xReturned = xTaskCreate(
                  vTaskCodeLEDOFF,       /* Function that implements the task. */
                  "LEDOFF",          /* Text name for the task. */
                  STACK_SIZE,      /* Stack size in words, not bytes. */
                  ( void * ) 1,    /* Parameter passed into the task. */
                  tskIDLE_PRIORITY + 2,/* Priority at which the task is created. */
                  &xHandle );      /* Used to pass out the created task's handle. */                        
                                                                              
    if( xReturned == pdPASS )
    {
      /* The task was created.Use the task's handle to delete the task. */
      //vTaskDelete( xHandle );
    }
      
}
/* Task to be created. */
void vTaskCodeLEDOFF( void * pvParameters )
{
    /* The parameter value is expected to be 1 as 1 is passed in the
    pvParameters value in the call to xTaskCreate() below.
    configASSERT( ( ( uint32_t ) pvParameters ) == 1 );
                */
                const TickType_t xDelay = 500 / portTICK_PERIOD_MS;
    for( ;; )
    {                        
                        LED_ON();      
                        vTaskDelay(xDelay);
    }
}

/* Task to be created. */
void vTaskCodeLEDON( void * pvParameters )
{
    /* The parameter value is expected to be 1 as 1 is passed in the
    pvParameters value in the call to xTaskCreate() below.
    configASSERT( ( ( uint32_t ) pvParameters ) == 1 );
                */
                const TickType_t xDelay = 1000 / portTICK_PERIOD_MS;
                //LED_ON();
    for( ;; )
    {                        
                        /* Task code goes here. */
                        LED_OFF();      
                        vTaskDelay(xDelay);

    }
}
#endif



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




</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

懒猫爱飞 发表于 2018-11-12 08:48

不错,帅!

hotsauce1861 发表于 2018-11-12 10:31

懒猫爱飞 发表于 2018-11-12 08:48
不错,帅!

:loveliness::loveliness::loveliness:
页: [1]
查看完整版本: MM32F031开发板评测 003 之 FreeRTOS移植