ch592-projects/vendor/FreeRTOS
2025-08-23 09:11:31 +10:00
..
FreeRTOS add freertos 2025-08-23 09:11:31 +10:00
Ld add freertos 2025-08-23 09:11:31 +10:00
Startup add freertos 2025-08-23 09:11:31 +10:00
readme.txt add freertos 2025-08-23 09:11:31 +10:00

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

本工程为 FreeRTOS-KernelV10.5.1 在Qingke V4C RISC-V内核的CH592/1上的移植。

需要注意以下几点:

	1.配置文件路径为工程目录下FreeRTOS/FreeRTOSConfig.h
	
	2.本移植例程默认使用了硬件压栈不可关闭未使用中断嵌套用户使用的外部中断函数最好使用__attribute__((section(".highcode")))修饰,保证运行速度。
	
	3.使能中断嵌套会导致每个中断执行会多约10个指令周期中断嵌套使能通过工程右键 -> properties -> c/c++ Build -> settings -> tool settings -> GNU RISC-V Cross Assembler -> Preprocessor 右边输入框Defined symbols中的 ENABLE_INTERRUPT_NEST=0 修改为 ENABLE_INTERRUPT_NEST=1 即可。

	4.startup_ch592.S中_vector_base下面的中断向量表库中如果是unified_interrupt_entry中断函数则是统一入口中断函数不需要再使用__attribute__((interrupt("WCH-Interrupt-fast")))或者__attribute__((interrupt()))修饰。其他则非统一入口需要使用__attribute__((interrupt("WCH-Interrupt-fast")))或者__attribute__((interrupt()))修饰。
	
	5.CH592系列上电运行默认的栈为编译后剩余的RAM空间。所有统一入口的中断会把栈修改为LD文件中提供的__freertos_irq_stack_top所以中断中可以使用的最大栈空间为RAM剩余空间。所以请一定要预留RAM空间给栈使用。
		
	6.因为Systick中断经常处理所以Systick中断不从统一中断入口处理并使用了__attribute__((interrupt("WCH-Interrupt-fast")))修饰Systick中调用的函数栈不大所以未切换为中断栈提升速度。
	
	7.中断中使用了CSR寄存器mscratch作为sp指针的临时寄存器所以用户不可以再自行使用mscratch寄存器。
	
	8.不建议使用蓝牙使用蓝牙的话可以创建一个优先级仅比IDLE TASK高一级的任务循环运行TMOS_SystemProcess不主动退出任务由其他更高优先级任务抢断。由于蓝牙中断为库内中断函数使用了免表中断方式所以初始化蓝牙时需要关闭中断等初始化完成后失能免表中断。在StartUP.S文件中已经将LIB中真正的中断函数地址BB_IRQLibHandler和LLE_IRQLibHandler放入中断向量表中。
	
	9.本工程的Startup.S文件和Ld文件都是单独的用户中断向量表可见Startup.S用户中断总入口unified_interrupt_entry和中断向量表_real_user_vector_base就在该文件中。
	
	10.FreeRTOS任务中函数的打印最好使用main.c中提供的APP_Printf进行不然可能会导致HardFault。
		
	11.CH592的蓝牙会采用类似于RTOS操作在中断中切换到另一个运行环境等待蓝牙事件完成所以如果使用蓝牙则必须在ble_task_scheduler.S中添加调用其他函数用来停止FreeRTOS操作系统防止在蓝牙内部任务中被切换。

	12.CH592不可以使用原core_riscv.h中的 __enable_irq 和 __disable_irq 函数使用freertos中提供的 portENTER_CRITICAL 和 portEXIT_CRITICAL。