[PIC®/AVR®/dsPIC®产品] 寻找大神分享PIC16和PIC18使用RTOS的相关资料

[复制链接]
ayfalcon 发表于 2025-8-25 20:10 | 显示全部楼层 |阅读模式
那位大神有PIC16和PIC18的RTOS的相关例程和资料,分享一下呗,非常感谢。MCC好像不支持RTOS,这点没有STM32Cube好。
heisexingqisi 发表于 2025-8-26 09:27 | 显示全部楼层
PIC 16没法跑OS。PIC18高级的可以跑。
heisexingqisi 发表于 2025-8-26 09:28 | 显示全部楼层


这个是PIC18F的FreeRTOS

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
heisexingqisi 发表于 2025-8-26 09:29 | 显示全部楼层
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 代码配置器生成的 并应用他们的许可证。 其他文件由我编写并属于公共领域。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

57

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部