This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

原有cmd的段长度不够,自己修改后提示程序写不进去。请教各位



我在头文件里面include了stdio.h并在main里面使用了pfrintf。后来系统编译的时候说我.text的段内存不够大。我看了一下初始时的cmd里面,text是放在page0里面的,长度只有0x1000。加上stdio.h之后,编译器说.text需要占用长度2200。因为cmd里有所有的段地址都安排好的,而且几乎是相邻的。那我就重新定义了一个段RAML9,选取了一个空间,定义了长度,将.text指定到这个段去。结果编译的时候就出现C28xx: Loader: One or more sections of your program falls into a memory region that is not writable. 我觉得了修改段长度或是自己定义一个新的段这是允许的,但我不知道是不是有些段不能给用户操作使用。请问出现这个错误是什么原因呢?但我不修改的话,加了新的头文件进来,对.text的长度要求增大了啊,那必须是要做修改的啊。我随便给了一个地址,

  RAML9      : origin = 0x0C0000, length = 0x003000 我见这个地址没用到,就随便用了。在看map的时候已经是看到已经使用了这个地址中的单元了。
  • Jonny, 请问您用的芯片型号是?

  • 你好Gavin Jiang,我用的是28335,我在考虑一个问题。是不是我新建的那个段,所分配的地址不满足内存映射。。。您觉得呢?因为现在对text段容量的要求比之前大了,那就必须要改,但28335cmd里面的地址几乎是连续的,也就是说改动了一段,后面的都要往后挪,所以我这才想自己新建一个段

  • 再麻烦您一下,其实很多人都会遇到实际开发项目的时候,原有的cmd的段不够长了。我看到其实在存储器映射图里面,有很大一部分的空间都是reserved保留着的。意思是那些空间我们可以随意使用还是不能使用呢?thank u

  • Jonny,

    是因为0x000c0000这个地址在物理上并没有存储设备(RAM或者Flash).然而你在软件上(cmd)文件告诉编译器,把这个地址作为RAM来用。然而运行的时候,发现数据放不进去,所以失败。

    RAML9 : origin = 0x0C0000, length = 0x003000

    如果需要,是可以定义一个大的RAM区域的。例如,你可以把RAML0, RAML1, RAML2, RAML3合并成一个大的RAM区。对应cmd文件原是:

    RAML0 : origin = 0x008000, length = 0x001000 /* on-chip RAM block L0 */
    RAML1 : origin = 0x009000, length = 0x001000 /* on-chip RAM block L1 */
    RAML2 : origin = 0x00A000, length = 0x001000 /* on-chip RAM block L2 */
    RAML3 : origin = 0x00B000, length = 0x001000 /* on-chip RAM block L3 */

    可以改为:

    RAML03 : origin = 0x008000, length = 0x004000 /* on-chip RAM block L0~L3 */

    下图是F28335的memory定义,供参考。

  • 嗯,我现在知道了。谢谢您,这关于cmd文件的修改光看资料还不够,必须得自己亲自改改,遇到错误后再分析分析。才能比较好的理解掌握