Ceedling搭配MPLABX XC8编译报NVMCON1bits未声明配置问题
报错根因
编译报错的核心是4处project.yml配置错误,导致XC8编译器无法正确识别目标芯片型号,无法加载PIC16F18325的SFR寄存器定义:
- 公共宏定义的key拼写错误:将
:common错写为:commmon(多了一个m),配置的全局宏完全没有被注入编译参数 - 芯片型号宏大小写错误:配置的
__PIC16f18325__不符合XC8的宏命名规则,正确宏为全大写的__PIC16F18325__,大小写不匹配会导致xc.h无法定位到对应芯片的头文件 - 环境变量名大小写不匹配:
:environment节点下定义的key是小写:mcu,但编译/链接工具参数中读取的是大写ENV['MCU'],Ruby读取环境变量严格区分大小写,直接导致-mcpu参数为空,XC8编译内置库(比如报错的__eeprom.c)时无法自动关联对应芯片的头文件 - 头文件路径配置错误:将具体头文件
pic16f18325.h的文件路径加入了include目录列表,C编译器只会把-I后的参数当做目录搜索,该配置无效。
修复步骤
直接修改project.yml对应节点即可:
- 修正
:defines节点的key拼写,同时修正芯片宏大小写:
:defines: :common: &common_defines - __PIC16F18325__ - __XC8 - UNITY_INT_WIDTH=16 - UNITY_POINTER_WIDTH=16 - CMOCK_MEM_INDEX_TYPE=uint16_t - CMOCK_MEM_PTR_AS_INT=uint16_t - CMOCK_MEM_ALIGN=1 - CMOCK_MEM_SIZE=256 :test: - *common_defines - UNITY_OUTPUT_COLOR - TEST :test_preprocess: - *common_defines - TEST
- 修正
:environment节点的变量名,和工具参数的读取逻辑保持一致,同时清理无效的path配置:
:environment: - :MCU: PIC16F18325 - :mplabx_root: "C:/Program Files/Microchip/xc8/v2.36/" - :path: - "C:/Program Files/Microchip/xc8/v2.36/bin" - "#{ENV['PATH']}"
- 修正
:paths > :include节点,只保留有效头文件目录,删除指向具体头文件的无效条目:
:paths: :test: - +:test/** - -:test/support :source: - source/** - -:source/mcc_generated_files/docs - -:source/mcc_generated_files/examples :include: - "C:/Program Files/Microchip/xc8/v2.36/pic/include" - "C:/Program Files/Microchip/xc8/v2.36/pic/include/c90" - "C:/Program Files/Microchip/xc8/v2.36/pic/include/c99" - "C:/Program Files/Microchip/xc8/v2.36/pic/include/legacy" - "C:/Program Files/Microchip/xc8/v2.36/pic/include/proc" :support: - test/support :libraries: []
验证方法
修改完成后先执行ceedling clobber清空所有历史构建缓存,再重新执行测试构建命令。确认编译输出的参数中-mcpu=PIC16F18325、-D__PIC16F18325__正确传递后,__eeprom.c找不到NVMCON1bits的报错会直接消失。
内容的提问来源于stack exchange,提问作者Tim Trudeau
相关产品推荐
相关产品推荐

