本帖最后由 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.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_InitTypeDef GPIO_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