本帖最后由 sujingliang 于 2025-4-27 14:44 编辑

从硬盘中找了一份freertos,拷贝到me32g03xxxxx lib 20240710\middlewares\freertos下

image.png

以之前使用的ME32例程做模板,开始配置freertos

image.png

建立一个middlewares组,将freertos下的c文件都加上

image.png

将上面两个路径加入到include路径中。

从rtos中找到FreeRTOSConfig.h和portmacro.h复制到例程inc


修改FreeRTOSConfig.h配置文件

<pre>//配置以下3个hook函数不用实现
  • //vApplicationStackOverflowHook
  • //vApplicationTickHook
  • //vApplicationMallocFailedHook

  • #define configUSE_MALLOC_FAILED_HOOK    0
  • #define configCHECK_FOR_STACK_OVERFLOW  0
  • #define configUSE_TICK_HOOK             0

  • //配置主频24Mhz
  • #define configCPU_CLOCK_HZ                                ( 24000000 )

  • //HEAP_SIZE配置3k,大概可以支持3个task
  • #define configMINIMAL_STACK_SIZE                ( ( unsigned short ) 128 )
  • #define configTOTAL_HEAP_SIZE                        ( ( size_t ) ( 3*1024 ) )

  • //为了节约空间,设为0
  • #define configUSE_TIMERS                                0

  • //SysTick中断函数由freertos接管
  • #define xPortSysTickHandler SysTick_Handler</pre>
  • 复制代码

    ME32G030缺省运行在24Mhz,要注意HEAP的大小,每个task大约占用780个字节。

    main.c

    int main(void)
  • {
  •         SystemCoreClockUpdate();
  •         SysTick_Config(SystemCoreClock / configTICK_RATE_HZ)
  •        
  •         PB->DIR_b.DIR12=1;
  •         PB->OUT_b .OUT12 =0;
  •        
  •         //init UART pin
  •         PA2_INIT(PA2_UART1_TX);
  •         PA3_INIT(PA3_UART1_RX);
  •        
  •         //initial UART1
  •         UART_Open(UART1,115200,UART_NO_PARITY,UART_TRIGGER_LEVEL_1_BYTE);

  •         UART_EnableInt(UART1, UART_RX_INT);

  •         NVIC_SetPriority(UART1_IRQn, 5);  // 不能低于SysTick
  •         NVIC_EnableIRQ(UART1_IRQn);
  •        
  •        //建立三个task
  •         xTaskCreate( vLED1Task, "LED1", configMINIMAL_STACK_SIZE, NULL,  tskIDLE_PRIORITY + 7 , NULL );       
  •         xTaskCreate( vLED2Task, "LED2", configMINIMAL_STACK_SIZE, NULL,  tskIDLE_PRIORITY + 6 , NULL );
  •         xTaskCreate( vLED3Task, "LED3", configMINIMAL_STACK_SIZE, NULL,  tskIDLE_PRIORITY + 7 , NULL );

  •         vTaskStartScheduler();

  •         while(1)
  •         {
  •        
  •         }
  • }
  • 复制代码

    一定要保证3个TASK的优先级小于uart中断,uart中断的优先级小于SysTick中断。(数值越大优先级越小)


    建立3个task函数

    <pre>void vLED1Task( void *pvParameters )
  • {
  •     for( ;; )
  •         {
  •                 printf("1 Free Heap: %d\n", xPortGetFreeHeapSize());
  •                 vTaskDelay(pdMS_TO_TICKS(1000));
  •         }
  • }

  • void vLED2Task( void *pvParameters )
  • {
  •     for( ;; )
  •         {
  •                //翻转PB12
  •                 GPIO_InvertOutPin(PB,IO_PIN12);
  •                 vTaskDelay(pdMS_TO_TICKS(1000));
  •         }
  • }

  • void vLED3Task( void *pvParameters )
  • {
  •   for( ;; )
  •         {
  •                 printf("vLED3Task\r\n");
  •                 vTaskDelay(pdMS_TO_TICKS(1000));
  •         }
  • }</pre>
  • 复制代码


    运行

    image.png