打印

代码超过78%编译通不过,24FJ64GA004的芯片

[复制链接]
2448|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
刘骁奖|  楼主 | 2007-11-23 14:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近用24FJ64GA004的芯片搞了个东东,代码量超过78%,编译就通不过!用C30的编译器!

开了优化代码之后,就没有问题了,为什么,郁闷....
//================================
以下是没有开优化的代码:
Program Memory Usage

section        address   length (PC units)   length (bytes) (dec)
-------        -------   -----------------   --------------------
.reset               0                 0x4             0x6  (6)
.ivt               0x4                0xfc           0x17a  (378)
.aivt            0x104                0xfc           0x17a  (378)
.text            0x200              0x5d74          0x8c2e  (35886)
.const          0x5f74              0x2670          0x39a8  (14760)
.dinit          0x85e4                0x16            0x21  (33)
.isr            0x85fa                 0x2             0x3  (3)

         Total program memory used (bytes):         0xc8f4  (51444) 78%


Data Memory Usage

section        address      alignment gaps    total length  (dec)
-------        -------      --------------    -------------------
.nbss            0x800                   0           0x24c  (588)
.ndata           0xa4c                   0             0xa  (10)

            Total data memory used (bytes):          0x256  (598) 7%


Dynamic Memory Usage

region         address                      maximum length  (dec)
------         -------                      ---------------------
heap                 0                                   0  (0)
stack            0xa56                              0x1daa  (7594)

            Maximum dynamic memory (bytes):         0x1daa  (7594)

C:Program FilesMicrochipMPLAB C30inpic30-coff-ld.exe: Error: Not enough contiguous memory for section .const.
//================================
开优化之后的编译结果:
Program Memory Usage

section        address   length (PC units)   length (bytes) (dec)
-------        -------   -----------------   --------------------
.reset               0                 0x4             0x6  (6)
.ivt               0x4                0xfc           0x17a  (378)
.aivt            0x104                0xfc           0x17a  (378)
.text            0x200              0x40f2          0x616b  (24939)
.const          0x42f2              0x2670          0x39a8  (14760)
.dinit          0x6962                0x16            0x21  (33)
.isr            0x6978                 0x2             0x3  (3)

         Total program memory used (bytes):         0x9e31  (40497) 61%


Data Memory Usage

section        address      alignment gaps    total length  (dec)
-------        -------      --------------    -------------------
.nbss            0x800                   0           0x24c  (588)
.ndata           0xa4c                   0             0xa  (10)

            Total data memory used (bytes):          0x256  (598) 7%


Dynamic Memory Usage

region         address                      maximum length  (dec)
------         -------                      ---------------------
heap                 0                                   0  (0)
stack            0xa56                              0x1daa  (7594)

            Maximum dynamic memory (bytes):         0x1daa  (7594)

Executing: "C:Program FilesMicrochipMPLAB C30inpic30-bin2hex.exe" "zzky.cof"
Loaded E:hengzhoucodeLCDzzky.cof.
BUILD SUCCEEDED: Fri Nov 23 14:23:01 2007
沙发
刘骁奖|  楼主 | 2007-11-23 16:35 | 只看该作者

来自台湾工程师的一个答案

經過多次的測試
發現 PIC24F 系列的 const 資料
(PIC24H PIC30F PIC33F 應該也會有此問題)
容量如果超過 32KB Flash ROM 容量
(實際資料量僅原來 Flash ROM 容量的 3 分之 2 即 21.x KB)
就會發生 Link Error 的情況

就算有沒有關閉 PSV 都ㄧ樣
且亦有關閉中斷中的 auto psv 功能
而且 const 的資料量越大
實際浪費的資料空間就越多
比方我 const 的資料量約 16KB 
但實際佔 Flash ROM 的空間卻是 24KB
如果我的資料量超過 22KB
實際佔 Flash ROM 的空間超過 32KB
就會出現 Link Error 的情形



因為我碰 Microchip 的 MCU 時間也不是很長

所以不知道是否是我哪裡設定錯誤所造成的
若有錯誤煩請告知
在下才疏學淺一時之間也想不到什麼更好的方法

只好將 const 的資料大量的移往外部的 24LCxxx
將 PIC24FJ128GA008 內 const 的資料維持在 32KB 以下
才 Link 成功

以上方式僅供參考


如果是我哪些設定沒設定好所造成的
煩請告知
以糾正我的錯誤


在const所宣告的資料會佔用一個 Instruction word 的 b0~b16 , 最高的 MSB b16~b23 是沒有用到的。所以設 16KB 的 ROM Data 會佔掉 24KB 的 Flash,這是對的。
沒見過超過 32KB 的data所以沒遇到這個問題,會請美國澄清的。不過為什麼要移到外部的 EEPROM 呢? 就算一個 Table 有 32Kb 的限制,那用兩個、三個 Table 應該是可以的,再說使用 Table Read 指令就沒有 PSV 32KB 的限制。

使用特权

评论回复
板凳
兰天白云| | 2007-11-24 08:30 | 只看该作者

正在用24FJ64GA004,到目前为止还没遇到LZ说的问题

使用特权

评论回复
地板
yewuyi| | 2007-11-24 09:01 | 只看该作者

和字长有没有关系?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

430

帖子

22

粉丝