【未解決】【CH32V307VCT6】移植FreeRTOS10.5.1遇到問題

FreeRTOS源碼:github最新release(202212.00),版本號10.5.1

移植過程復(fù)現(xiàn):

1.MRS中創(chuàng)建NoneOS項目

2.復(fù)制FreeRTOS的內(nèi)核源代碼文件:

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.復(fù)制MRS提供的FreeRTO項目模板中的FreeRTOSConfig.h到User目錄下

4.修改ld文件, 添加__freertos_irq_stack_top到對應(yīng)位置(修改后和FreeRTO項目模板中的一致)

5.為項目匯編器和C編譯器添加相應(yīng)的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);
????}
}

遇見問題:

當(dāng)函數(shù)執(zhí)行至xTaskCreate,程序會直接進(jìn)入HardFault中斷,StackTrace:

xTaskCreate->pvPortMalloc->xTaskResumeAll->taskENTER_CRITICAL->HardFault_Handler

經(jīng)過排查,發(fā)現(xiàn)啟動文件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

再次遇見問題:

程序不再進(jìn)入HardFault,但是會不停復(fù)位。


本人能力有限,到這里就不知道如何解決了,希望大佬們能幫忙看看。


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

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


裸跑單一例程沒問題,改了startup_ch32v30x_D8C.S后系統(tǒng)跑但歷程一放到vtask不是卡住就沒反應(yīng),坐等技術(shù)支持。


您好,MRS新建工程可以直接新建FreeRTOS工程,可以在這基礎(chǔ)上進(jìn)行移植或直接使用新建工程。若想檢查問題,可以對比一下各文件區(qū)別,如port.c文件。若需要,上班后我會測試一下你的工程,后續(xù)溝通可以通過郵件(lzs@wch.cn)進(jìn)行溝通。


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频