本帖最后由 watershade 于 2017-3-12 20:44 编辑
此内容由EEWORLD论坛网友watershade原创,如需转载或用于商业用途需征得作者同意并注明出处
这真是折腾的周末,昨天下午开始继续学习C2000.按照教程main简单了解了
建立portable project的方法。
过程不难,都做的很好。可是到了调试的时候却出现了问题。
提示.ebss空间不足。我检查了其中提到的F28027Fx_generic_ram.cmd.
图1
其中提到了:
.stack : > RAMM1, PAGE = 1
.ebss : > RAMM1, PAGE = 1
.econst : > RAMM1, PAGE = 1
.esysmem : > RAMM1, PAGE = 1
我个人觉得没有问题,因为在MEMORY里面RAMM1定义是0x400。根据错误提示,而.ebss只需要0x22。
如果stack不大,不至于呀。可是stack是未初始化区域。它的大小在哪里。cmd里面没找到呀。
作为一个不用功的新手,我很惭愧。对CCS还是不够熟悉。我在CCS7和CCS6之间来回切换建立项目,也在不同版本
下建立项目。还是一样的错误。当然我也更换过cmd。但是没用。
我已经放弃了。就看main之后的内容,然后又看了labs。这是我发现labs讲的不是和main一样吗?只是main的比较粗略。这时,我又一步一步看。终于发现了问题所在。
图2
红圈中之前是0x300.需要将其缩小到0x200.
这样一编译就通过了:
图3
但是,我仍然有疑惑。即便stack保留0x300的空间。不是剩下0x100的RAMM1空间吗?
而.ebss只需要0x22不是吗?至少这个工程是这样。那说明还有东西占据了这个空间。
那好,我们查看官方对于存储的规定是什么?
图4
这是
http://processors.wiki.ti.com/in ... derstanding_Linking网址提供的。
但是不幸的是,这个网页我没有用心看。所以对图表的理解就是在SARAM区域,目前另一种可能性是MALLOC占据了空间。
但是是不是呐?
我打开memory allocation视图:
图5
视图很明确的告诉我:你太low了。我把.econst放在这里了。
它这样搞,当然在我设置.stack是0x300时。没有任何空间了。
又查看代码的确如此。
在.ebss下面刚好是.econst(上面提到了)。那么问题是这个.econst按照图4不应该在flash区吗,在PAGE0?
但是我也能够理解将存储从PAGE0搬到PAGE1这种应用。但是那也应该在可变变量区域。
我同时看到早F2802x_Headers_nonBIOS.cmd的PAGE 1种定义了许多区段。比如SPI-A register 。EPWM什么的。
这显然是硬件相关的存储区域。但是为什么硬件设备的寄存器在这个区域呐?这不是掉电就消失的吗?
所以这个区域会不会是在上电后,通过引导加载到这个区域的。另外这个区域也不见到就是上面的.econst存储的区域。
因为origin的数值不一样。是不是内存映射?
看来手册没有认真看的结果。
那到底.econst是在哪里指定的。还刚好是256呐?
吃完饭,想起看map文件了:
原来这部分存的是中断向量表。何以见得?
f2802x_pievect.obj这个文件想必是f2802x_pievect.c的目标文件。
OK,那好办。我们去见见中断向量表的真面目:
好的我数一数一共几个?不多不少128个。难道不应该是256吗?或者说4*128(32-bit),可偏偏是256.
哪再仔细看InitPieVectTable函数,这个想必就是用来实现中断向量表初始化程序。
程序先跳过了三个存储区,然后125次循环移位赋值。可是这里的每次跳转的存储区也是uint32的长度,也就是说等同于4个字节。所以我不懂呀?
那好,继续看在哪里实现的中断向量初始化。在上面提到的nonBIOS色SECTION起始的地方,看到了一个UNION.
UNION run = PIE_VECT, PAGE = 1
{
PieVectTableFile
GROUP
{
EmuKeyVar
EmuBModeVar
FlashCallbackVar
FlashScalingVar
}
}
暂时对cmd的语法还不能完全理解,毕竟偷了懒没看手册。这里的PIE_VECT应该就是我要找的区段.econst。
继续寻寻觅觅,发现这里的表示的PIE_VECT含义如下:
PIE_VECT : origin = 0x000D00, length = 0x000100 /* PIE Vector Table */
实际上我期望的是origin = 0x000600.所以这个不是,但是大小相对应。我意识到找错了,但这两个会不会有什么关联呐?
我同时意识到要在调用InitPieVectTable函数之前找。但是还是找不到,那么这部分到底在哪里?
此外,我还想了解controlSUITE中nonBIOS.cmd和BIOS.cmd的区别。
这里将两个从官方下载的教程给出,希望可以帮到你:
1、main:
sdoapps_ws_f28027_ccsv6_fundamentals-workshop-main.pptx
(3.99 MB, 下载次数: 16)
2、labs:
sdoapps_ws_f28027_ccsv6_fundamentals-workshop-labs.pptx
(2.41 MB, 下载次数: 17)