【未解决】【CH32V307VCT6】移植FreeRTOS10.5.1遇到问题

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,但是会不停复位。


本人能力有限,到这里就不知道如何解决了,希望大佬们能帮忙看看。


项目文件已打包到附件中:?icon_rar.gifCH32V307VCT6.zip

使用ide自动生成的freertos工程不香么!


裸跑单一例程没问题,改了startup_ch32v30x_D8C.S后系统跑但历程一放到vtask不是卡住就没反应,坐等技术支持。


您好,MRS新建工程可以直接新建FreeRTOS工程,可以在这基础上进行移植或直接使用新建工程。若想检查问题,可以对比一下各文件区别,如port.c文件。若需要,上班后我会测试一下你的工程,后续沟通可以通过邮件(lzs@wch.cn)进行沟通。


只有登录才能回复,可以选择微信账号登录