linker - PIC18 XC8 引导加载程序未映射到正确地址
问题描述
我正在为 PIC18F87K22 编写引导加载程序。我使用了他们的文档/网络研讨会-mrom
中推荐的命令行参数来限制编译器将东西放入 ROM 的范围在 0x0000-0x0FFF 之间,这应该给我 4K 来写入引导加载程序。但是当使用该标志时,我得到链接器错误
:0:: 错误:(500) 未定义符号:
我发现如果我将范围从 0x0000-0xFFFF 扩大,那么它会正确构建,但目前,我的代码相当简单,只使用 258 个字节,它应该很容易适应分配的空间。由于某种原因,编译器不会在以 0x001C 和地址 0x1000 结束的中断向量之间放置任何代码,因此这将近 4k 的闪存区域将被浪费。应用程序内存限制已经越来越紧,我真的负担不起这种开销。任何想法都会有所帮助。我目前正在使用 xc8 v2.20。
这是在 0x0000-0xFFFF 范围内构建时我的地图文件的相关部分
Machine type is 18F87K22 Name Link Load Length Selector Space Scale /tmp/xcXmJhLIj.o idloc 200000 200000 8 0 5 config 300000 300000 E 0 4 init 0 0 4 0 0 dist/default/production/PIC-18F87K22-BOOTLOADER.X.production.o idloc 200000 200000 8 0 5 config 300000 300000 E 0 4 smallconst 1000 1000 14 800 0 text3 10B8 10B8 3C 80A 0 text2 1014 1014 66 80A 0 text1 107A 107A 3E 80A 0 text0 10F4 10F4 14 80A 0 cstackCOMRAM 1 1 A 1 1 cinit 1108 1108 E 80A 0 TOTAL Name Link Load Length Space CLASS STACK CLASS CODE init 0 0 4 0 text3 10B8 10B8 3C 0 text2 1014 1014 66 0 text1 107A 107A 3E 0 text0 10F4 10F4 14 0 cinit 1108 1108 E 0 CLASS CONST CLASS SMALLCONST smallconst 1000 1000 14 0 CLASS MEDIUMCONST CLASS COMRAM cstackCOMRAM 1 1 A 1 CLASS ABS1 CLASS BIGRAM CLASS RAM CLASS BANK0 CLASS BANK1 CLASS BANK2 CLASS BANK3 CLASS BANK4 CLASS BANK5 CLASS BANK6 CLASS BANK7 CLASS BANK8 CLASS BANK9 CLASS BANK10 CLASS BANK11 CLASS BANK12 CLASS BANK13 CLASS BANK14 CLASS BANK15 CLASS SFR CLASS CONFIG config 300000 300000 E 4 CLASS IDLOC idloc 200000 200000 8 5 CLASS FARRAM CLASS EEDATA SEGMENTS Name Load Length Top Selector Space Class reset_vec 000000 000004 000004 0 0 CODE text2 001014 000102 001116 80A 0 CODE cstackCOMRAM 000001 00000A 00000B 1 1 COMRAM smallconst 001000 000014 001014 800 0 SMALLCON
解决方案
推荐阅读
- java - 为什么我的 Java 函数返回 null?
- go - 从结构内部的指向 float32 的指针中获取值?
- lisp - Common Lisp:函数返回函数名
- json - 模式不适用于 json 上下文中的惰性正则表达式
- c++ - GNU order-statistics-tree 的意外结果
- java - 休眠关系在注释方式上找不到外键
- python-3.x - 给出错误:TypeError:需要一个类似字节的对象,而不是“str”
- sql - 将 oracle 的 listagg 转换为 postgres
- c++ - 检测传递给函数模板函数参数的特定函数
- java - 无法访问语言环境消息