mirror of
https://gitee.com/cosyos/cosyos.git
synced 2026-08-17 16:52:27 +08:00
RISC-V32 之系统构建 概述 1、rv32 目前暂不支持 cube 安装,用户需手动移植。移植过程中遇到问题 可加入社区获取技术支持。 2、目前仅支持 PSP栈模式,即不存在全局唯一主栈或中断专用栈,而是当前 任务栈即为当前主栈。这导致所有中断都是入任务栈,所以中断嵌套深度 应尽量配置少一些,同时任务栈SIZE应尽量大一些,以防溢出。 3、CosyOS 采用了自研先进技术,可实现 CH32V 全程开启硬件压栈。 该技术为纯软件实现,不依赖特定硬件(0x804->bit5),V103、203 等 皆可完美支持。所以,如果您的处理器支持硬件压栈,千万不要忘记开启。 如果开启硬件压栈,中断函数的声明原则等同裸机。即如果最大硬件压栈 深度为3级,需要将低优先级的三级中断声明为硬件压栈,高优先级的中断 声明为软件压栈。 移植流程(以 MRS2 为例) 1、裸机工程 准备项目的裸机工程,仅为一个最基础的裸机工程即可。 2、拷贝文件 拷贝 CosyOS-源代码 至裸机工程中。 3、删除文件 删除 CosyOS-源代码 中无用的文件,使其不被编译。 (1)Demo-Service,直接删除 (2)Demo-Build 中,仅保留 RISC-V32、demo_task.c (3)Port 中,仅保留 port_x32、syscfg.h (4)Port / port_x32 中,仅保留 RISC-V32、port_x32.c、port_x32.h 4、包含路径 在工程中添加下方的包含路径。 C包含路径: cosyos-v3.0.1/System cosyos-v3.0.1/Port cosyos-v3.0.1/Port/port_x32 cosyos-v3.0.1/Port/port_x32/RISC-V32 汇编包含路径: cosyos-v3.0.1/Port cosyos-v3.0.1/Port/port_x32/RISC-V32 构建例程 0、Include/Exclude Port / port_x32 / RISC-V32 / port_rv32_SWS.S,为软件压栈专用; Port / port_x32 / RISC-V32 / port_rv32_HWS.S,为硬件压栈专用; 根据是否启用硬件压栈,Include相匹配的文件,Exclude不匹配的文件。 1、系统配置 Port / syscfg.h -> 系统配置>>处理器架构,应定义为 4。 Port / syscfg.h -> 系统配置>>标准头文件,需要正确定义,如定义为 "ch32v30x.h"。 2、MCU配置 Port / port_x32 / RISC-V32 / mcucfg_rv32.h 中,配置系统滴答和 系统时钟。 3、main函数 在main函数的末尾处,先配置 DEBUG(如果使用 CosyOS-任务管理器), 最后再启动 CosyOS(必须)。 4、系统中断 CosyOS 固定采用 SysTick_Handler 和 SW_Handler 做为系统中断。 用户需要自行在 SysTick_Handler 中调用 tCosyTick_Handler。 用户不要自行创建 SW_Handler。 5、DEBUG(可选,参照例程 demo_debug.c) 在未来,用户仍需重点关注如下内容: 1、系统配置 Port / syscfg.h 2、MCU配置 Port / port_x32 / RISC-V32 / mcucfg_rv32.h 3、启动文件配置 在 handle_reset 中,配置特权级(mstatus); 配置硬件压栈使能、中断嵌套使能、中断嵌套深度、硬件压栈溢出后中断使能(0x804)。 4、ld文件配置 配置硬件栈size。 通常配置一个极小的数值即可,据不完全测试,该值配置为0即可正常运行: __stack_size = 0; 例程 /* 例程-main */ int main(void) { /* USER INIT CODE BEGIN */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); SystemCoreClockUpdate(); Delay_Init(); ////USART_Printf_Init(115200); USART1_UART_Init (115200); printf("SystemClk:%d\r\n",SystemCoreClock); printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() ); printf("This is printf example\r\n"); /* USER INIT CODE END */ /* USER DEBUG CONFIG */// for CosyOS-Taskmgr #if (SYSCFG_DEBUGGING == 1) if(1){ void Debug_Config(void); Debug_Config(); }// defined in demo_debug.c #endif /* USER 启动 CosyOS */// 在main函数的末尾处 if(1){ #if 1 // 建议前期调试时开启,如果CosyOS启动失败会返回错误码提示用户! unsigned char _ecode = uStartCosyOS(); printf("CosyOS startup failed, error code: %d.\r\n", (int)_ecode); #else uStartCosyOS(); #endif } while(1); } /* 例程-SysTick_Handler */// 根据是否启用硬件压栈,选择相匹配的声明方式: //void SysTick_Handler(void) __attribute__((interrupt)); // 声明为软件压栈 void SysTick_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); // 声明为硬件压栈 void SysTick_Handler(void) { SysTick->SR = 0; tCosyTick_Handler(); }