PIC18F_XC8_FreeRTOS
用于 PIC18F 和 XC8 的 FreeRTOS 端口。
赋予动机
我需要一个 5V 解决方案。有一个用于 PIC18F452(旧...) 和 C18(旧... 所以我尝试移植 PIC18F 和 XC8。
我只用PIC18F27Q43进行了测试,但我相信其他最近的 PIC18F MCU 也适用。 由于 FreeRTOS 代码大小有点大,因此首选 64KB 或更大的闪存。
如果我需要 3.3V 解决方案,也许我选择了 STM32L。 顺便说一句,我不熟悉 AVR MCU。
仅协作调度程序
由于堆栈指针由两个寄存器 FSR1L 和 FSR1H 组成, 堆栈指针的计算不是原子的。 修改 FSR1L 和修改 FSR1H 之间有一个关键部分。
下面是从 .lst 文件中获取的示例。 总共具有 6 字节局部变量的函数的开头:
2454 004964 0E06 movlw 6
2455 004966 26E1 addwf fsr1l,f,c
2456 004968 0E00 movlw 0
2457 00496A 22E2 addwfc fsr1h,f,c
FreeRTOS 通常将任务上下文保存在堆栈的顶部。 如果使用抢占式调度程序,并且滴答计时器中断发生在之后但在之前,则堆栈指针计算 不完整,则任务上下文可以保存在错误位置。addwf fsr1l,f,caddwfc fsr1h,f,c
这是一个非常小的窗口,但不容忽视。 所以我决定这个端口仅用于协作调度程序。
上下文切换时间
多任务处理不适合PIC18F MCU的范围。 需要许多指令来维护上下文切换。
宏执行上下文切换,获得大约 650 条指令 周期。 当 Fosc=64MHz 时,每微秒 16 个指令周期,约 40 微秒 每个上下文切换。portYIELD()
LED闪烁演示
该存储库包含一个 LED 闪烁演示的 MPLAB X IDE 项目。 使用 MPLAB X IDE 打开 git 克隆文件夹。
Demo/ : written by me.
FreeRTOS/ : copied from the FreeRTOS repository.
Demo/ : contains the LED flashing demo: flash.c
Source/ : contains the FreeRTOS kernel.
mcc_generated_files/ : generated by the MCC, MPLAB Code Configurator.
nbproject/ : MPLAB X IDE project folder.
portable/ : written by me.
FreeRTOSConfig.h : copied from the FreeRTOS repository and modified.
main.c : generated by the MCC and modified.
Makefile : generated by the MCC.
PIC18F_XC8_FreeRTOS.mc3 : MCC config file.
- MPLAB X IDE v5.50
- XC8 v2.32
- PIC18F-Q_DFP 1.12.193
- MPLAB Code Configurator 5.0.3
调整编译器
XC8 试图积极优化。 如果 XC8 认为一个函数在任何时候都没有被调用,则该函数不会被调用 编译并被忽略。 如果 XC8 认为任何时候都未使用一个指针,则视为该指针 一如既往地为 NULL,并以这种方式编译。
任务处理函数有时被 XC8 视为“未调用”。 为了防止这种情况,我将任务处理函数的虚拟调用放在 . 然而,我还把虚拟调用放在了 中 有时 XC8 矫枉过正。 如果您遇到奇怪的行为,您可能需要仔细检查 .lst 和 .map 文件。pxPortInitialiseStackvPortAdjustCompilerxPortStartScheduler
版权和许可
某些文件是从 FreeRTOS 存储库复制的,并应用其许可证。 有些文件是由 MPLAB X IDE 和 MPLAB 代码配置器生成的 并应用他们的许可证。 其他文件由我编写并属于公共领域。
|