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
不错,帅!
:loveliness::loveliness::loveliness:
页:
[1]