FreeRTOS 需要注意以下几点:
- 配置文件路径为工程目录下
FreeRTOS/portable/FreeRTOSConfig.h
- 本移植例程默认使用了硬件压栈(不可关闭),未使用中断嵌套,中断函数最好使用
__attribute__((section(".highcode")))
修饰,保证运行速度我猜测任务栈和中断栈是用的一个,假如中断没有及时出栈,可能会影响到任务栈的运行。
__attribute__((section(".highcode")))
这个修饰符是为了让代码运行在 RAM 里面,让中断更快运行完成尽快出栈。目前建议尽量少用中断。 - 使能中断嵌套会导致每个中断执行会多约 8 个指令周期,中断嵌套使能通过工程右键 -> properties -> c/c++ Build -> settings -> tool settings -> GNU RISC-V Cross Assembler -> Preprocessor 右边输入框Defined symbols中的 ENABLE_INTERRUPT_NEST=0 修改为 ENABLE_INTERRUPT_NEST=1 即可。
对于 CMakeLists 而言,加入
add_definitions(-DENABLE_INTERRUPT_NEST=1)
就好 - 用户中断函数不需要再使用
__attribute__((interrupt("WCH-Interrupt-fast")))
或者__attribute__((interrupt()))
修饰,中断入口已统一为汇编函数,在汇编函数中调用用户中断函数。库自带的HardFault
中断除外,用户只需要修改自己编写的中断函数即可。 - CH583 系列上电运行默认的栈为编译后剩余的 RAM 空间。所有统一入口的中断会把栈修改为 LD 文件中提供的
__freertos_irq_stack_top
,所以中断中可以使用的最大栈空间为 RAM 剩余空间。所以请一定要预留 RAM 空间给栈使用。 - 中断中使用了 CSR 寄存器 mscratch 作为 sp 指针的临时寄存器,所以用户不可以再自行使用 mscratch 寄存器。
- 不建议使用蓝牙,使用蓝牙的话可以创建一个优先级仅比
IDLE TASK
高一级的任务,循环运行TMOS_SystemProcess
,不主动退出任务,由其他更高优先级任务抢断。由于蓝牙中断为库内中断函数,使用了免表中断方式,所以无法改为统一栈,所以如果使用蓝牙的话,每个任务栈需要额外加上蓝牙中断中使用的大小,约128字节。 - 本工程的
Startup.S
文件和 Ld 文件都是独立的,用户中断向量表可见工程目录下FreeRTOS/portable/port.c
,用户中断总入口user_interrupt_handler
和SysTick_Handler
就在该文件中。 - FreeRTOS 任务中函数的打印最好使用
main.c
中提供的APP_Printf
进行,不然可能会导致HardFault
。