本篇测评移植freeRTOS, 实现多任务操作,1秒打印“Hello 21ic, Hello MM32F0121"字符串,让LED闪烁.
要移植,先得去下载源码,可以直接去官网下载https://www.freertos.org/,我这里下载的是
下载完后就是移植文件,下面的文件中有很多其它类别的文件,这里只要复制核心文件就可以了
打开这个文件夹,复制里面的文件到示例工程中
复制完后,还需要一个FreeRTOSConfig.h,内容如下
- #ifndef FREERTOS_CONFIG_H
- #define FREERTOS_CONFIG_H
- #define configUSE_PREEMPTION 1
- #define configUSE_IDLE_HOOK 0
- #define configUSE_TICK_HOOK 0
- #define configCPU_CLOCK_HZ (72000000UL)
- #define configTICK_RATE_HZ ((TickType_t)1000)
- #define configMAX_PRIORITIES (5)
- #define configMINIMAL_STACK_SIZE (64) // word, 64*4 = 256 bytes
- #define configTOTAL_HEAP_SIZE ((size_t)(6*1024))
- #define configMAX_TASK_NAME_LEN (10)
- #define configUSE_TRACE_FACILITY 0
- #define configUSE_16_BIT_TICKS 0
- #define configIDLE_SHOULD_YIELD 1
- #define configUSE_MUTEXES 1
- #define configQUEUE_REGISTRY_SIZE 0
- #define configCHECK_FOR_STACK_OVERFLOW 1
- #define configUSE_RECURSIVE_MUTEXES 0
- #define configUSE_MALLOC_FAILED_HOOK 1
- #define configUSE_APPLICATION_TASK_TAG 0
- #define configUSE_COUNTING_SEMAPHORES 0
- /* Software timer definitions. */
- #define configUSE_TIMERS 0
- /* API function inclusion */
- #define INCLUDE_vTaskPrioritySet 1
- #define INCLUDE_uxTaskPriorityGet 1
- #define INCLUDE_vTaskDelete 1
- #define INCLUDE_vTaskCleanUpResources 0
- #define INCLUDE_vTaskSuspend 1
- #define INCLUDE_vTaskDelayUntil 1
- #define INCLUDE_vTaskDelay 1
- /* Cortex-M specific */
- #define configPRIO_BITS 2 // Cortex-M0
- #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 3
- #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 1
- #define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
- #define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
- #define configASSERT(x) if ((x) == 0) { taskDISABLE_INTERRUPTS(); for(;;); }
- /* Hook SysTick/PendSV/SVC */
- #define xPortPendSVHandler PendSV_Handler
- #define vPortSVCHandler SVC_Handler
- #define xPortSysTickHandler SysTick_Handler
- #endif
还去屏蔽原来自带的延时函数,和两个中断函数,
main.c内容
- #include "platform.h"
- #include "FreeRTOS.h"
- #include "task.h"
- extern void freeRTOS_Demo(void);
- int main(void)
- {
- PLATFORM_Init(); // 初始化硬件,比如LED GPIO等
- freeRTOS_Demo();
- while (1);
- }
新建一个freeRTOS_Demo.c,内容如下
- #include "FreeRTOS.h"
- #include "task.h"
- #include "platform.h"
- #include <stdio.h>
- // 任务栈大小 (单位:word)
- #define LED_TASK_STACK_SIZE 128
- #define PRINT_TASK_STACK_SIZE 256
- void vLED1Task(void *pvParameters) {
- while(1) {
- PLATFORM_LED_Toggle(LED1);
- vTaskDelay(pdMS_TO_TICKS(100));
- }
- }
- void vLED2Task(void *pvParameters) {
- while(1) {
- PLATFORM_LED_Toggle(LED2);
- vTaskDelay(pdMS_TO_TICKS(500));
- }
- }
- void vPrintTask(void *pvParameters) {
- while(1) {
- printf("Hello MM32F0121 FreeRTOS!\r\n");
- vTaskDelay(pdMS_TO_TICKS(2000));
- }
- }
- void vApplicationMallocFailedHook(void)
- {
- printf("Malloc failed!\r\n");
- taskDISABLE_INTERRUPTS();
- while(1);
- }
- void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName)
- {
- printf("Stack overflow in task: %s\r\n", pcTaskName);
- taskDISABLE_INTERRUPTS();
- while(1);
- }
- void freeRTOS_Demo(void)
- {
- xTaskCreate(vLED1Task, "LED1", LED_TASK_STACK_SIZE, NULL, 2, NULL);
- xTaskCreate(vLED2Task, "LED2", LED_TASK_STACK_SIZE, NULL, 2, NULL);
- xTaskCreate(vPrintTask, "Print", PRINT_TASK_STACK_SIZE, NULL, 3, NULL);
-
- vTaskStartScheduler();
-
- // 正常不会执行到此
- printf("Scheduler failed to start.\r\n");
- while(1);
- }
接下来就是编译,正常是0错误,0警告,下载到开发板,效果如下
|