FreeRTOS源码:github最新release(202212.00),版本号10.5.1
移植过程复现:
1.MRS中创建NoneOS项目
2.复制FreeRTOS的内核源代码文件:
C:\USERS\SAISE\DESKTOP\HARDWARE\CH32V307VCT6\FREERTOS │??croutine.c │??event_groups.c │??list.c │??queue.c │??stream_buffer.c │??tasks.c │??timers.c │ ├─include │??????atomic.h │??????croutine.h │??????deprecated_definitions.h │??????event_groups.h │??????FreeRTOS.h │??????list.h │??????message_buffer.h │??????mpu_prototypes.h │??????mpu_wrappers.h │??????portable.h │??????projdefs.h │??????queue.h │??????semphr.h │??????StackMacros.h │??????stack_macros.h │??????stream_buffer.h │??????task.h │??????timers.h │ └─portable ????├─GCC ????│??└─RISC-V ????│??????│??port.c ????│??????│??portASM.S ????│??????│??portContext.h ????│??????│??portmacro.h ????│??????│ ????│??????└─chip_specific_extensions ????│??????????└─RISCV_no_extensions ????│??????????????????freertos_risc_v_chip_specific_extensions.h ????│ ????└─MemMang ????????????heap_4.c
3.复制MRS提供的FreeRTO项目模板中的FreeRTOSConfig.h到User目录下
4.修改ld文件, 添加__freertos_irq_stack_top到对应位置(修改后和FreeRTO项目模板中的一致)
5.为项目汇编器和C编译器添加相应的Include路径
6.编写程序并编译烧录
主程序:
#include?"FreeRTOS.h" #include?"task.h" #include?"debug.h" TaskHandle_t?hTaskBlink; void?GPIO_User_Init(void); void?TaskBlink(void*?pArgs); void?main(void)?{ ????NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); ????Delay_Init(); ????GPIO_User_Init(); ????USART_Printf_Init(115200); ????printf("\nMCU:?CH32V307VCT6\n"); ????printf("FreeRTOS?Version:?%s",?tskKERNEL_VERSION_NUMBER); ????printf("SystemClock:?%d\n",?SystemCoreClock); ????xTaskCreate(TaskBlink,?"task1",?256,?NULL,?5,?&hTaskBlink); ????vTaskStartScheduler(); } void?GPIO_User_Init(void)?{ ????GPIO_InitTypeDef?gpio_init_struct?=?{?0?}; ????RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,?ENABLE); ????gpio_init_struct.GPIO_Pin?=?GPIO_Pin_0; ????gpio_init_struct.GPIO_Mode?=?GPIO_Mode_Out_PP; ????gpio_init_struct.GPIO_Speed?=?GPIO_Speed_50MHz; ????GPIO_Init(GPIOA,?&gpio_init_struct); } void?TaskBlink(void*?pArgs)?{ ????while(1)?{ ????????GPIO_WriteBit(GPIOA,?GPIO_Pin_0,?Bit_SET); ????????uint8_t?pin_a0_state?=?GPIO_ReadOutputDataBit(GPIOA,?GPIO_Pin_0); ????????printf("pin?a0?state:%u\n",?pin_a0_state); ????????vTaskDelay(1000); ????????GPIO_WriteBit(GPIOA,?GPIO_Pin_0,?Bit_RESET); ????????pin_a0_state?=?GPIO_ReadOutputDataBit(GPIOA,?GPIO_Pin_0); ????????printf("pin?a0?state:%u\n",?pin_a0_state); ????????vTaskDelay(1000); ????} }
遇见问题:
当函数执行至xTaskCreate,程序会直接进入HardFault中断,StackTrace:
xTaskCreate->pvPortMalloc->xTaskResumeAll->taskENTER_CRITICAL->HardFault_Handler
经过排查,发现启动文件startup_ch32v30x_D8C.S和项目模板中的不一致,修改371行和375行,和项目模板保持一致,修改后:
/*?Enable?nested?and?hardware?stack?*/ li?t0,?0x1f csrw?0x804,?t0 /*?Enable?floating?point?and?interrupt?*/ ??? li?t0,?0x7800 ??? csrs?mstatus,?t0
再次遇见问题:
程序不再进入HardFault,但是会不停复位。
本人能力有限,到这里就不知道如何解决了,希望大佬们能帮忙看看。
项目文件已打包到附件中:?CH32V307VCT6.zip