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.

28069M例程中结构体初始化问题

Other Parts Discussed in Thread: MOTORWARE

我用的ccs9.0, 基于28069M; 采用的是motorware下的project_lab13b例程。我在例程中加入了我自己的其他程序,一切运行正常。

然而,最近在加入canopen通讯时,有一个结构体的初始化碰到了问题,具体表现是结构体中各元素不能正确的赋给对应的值,甚至是错误的。具体例程如下:

定义了如下一个结构体(实际结构体元素比这个多的多,此处以4个元素为例):

在.h文件中定义如下结构体:

struct CANOPEN_TEST
{
UNS32 test0000;
UNS16 test1000;
UNS8 test1001;
UNS32 test1002;
};

在.c文件中定义初始化结构体如下:

struct CANOPEN_TEST CanTestInit={
.test0000 = 0x00040132,
.test1000 = 0x1185,
.test1001 = 0x5,
.test1002 = 0x00040222,
};

在主函数文件开头定义如下:

struct CANOPEN_TEST CanTest;

extern struct CANOPEN_TEST CanTestInit;

在主函数开始,定义如下初始化语句:

CanTest = CanTestInit;

或者逐个元素赋值也可以(此处略)。

编译无误,运行结果是:

CanTest.test0000 = 0x00040132;

CanTest.test1000 = 0x1185;

CanTest.test1001 = 0;

CanTest.test1002 = 0;

很明显,后面2个元素没有赋给初始值;这是怎么回事?

另外,实际当另一个结构体中元素很多时,每一个元素的值都不是初始化结构体中原来给的的初始值,感觉没有传递过去,或者是乱的。这是怎么回事?

可能的问题或者原因在哪里?好几天了就耗在这个问题上毫无进展。

  • 若是可以的话,请点击我的头像,而后点击右边的 连接 ,以私信形式发送一下您的工程。我们会在测试后给您回复,谢谢
  • 谢谢,我的工程基于project_lab13b例程;我一点一点加了很多自己的程序进去;运行正常,到现在我已经加了很多内容进去,自认为这个工程算法很复杂了。我直接就在motorware下面的例程中进行的,没有单另建立自己的工程目录;又因为公司IP政策限制,无法向外发出工程文件,请见谅。关于我这个问题,程序编译没有问题,正常的定时器0中断,CAN接收中断,PWM主函数中断,等都没有问题;就是发现该结构体初始化值不正确,导致我无法往下进行canopen的后续开发。 顺便吐槽一下,这种motorware风格的程序没有controlsuit那种来的直接,这个程序量大了之后感觉越来越复杂,我现在已经回不去了,不然,真的还是传统的controlsuit的那种直接对寄存器操作的方式程序更简洁易用,不知道TI在这方面是如何考虑的,未来的发展如何?当然,我目前的问题还是您们能帮我定性的分析一下可能存在的原因,或者可能从哪几个方面去寻找原因或者修改,以解决我的问题。谢谢。
  • user5912823 说:
    这种motorware风格的程序没有controlsuit那种来的直接,这个程序量大了之后感觉越来越复杂,我现在已经回不去了,不然,真的还是传统的controlsuit的那种直接对寄存器操作的方式程序更简洁易用,不知道TI在这方面是如何考虑的,未来的发展如何?

    这个在E2E上有相关的讨论,您可以参考一下

    user5912823 说:
    目前的问题还是您们能帮我定性的分析一下可能存在的原因,或者可能从哪几个方面去寻找原因或者修改

    我在例程内试了一下,可以正常传递。您这种写法是没有问题的。个人感觉应该是cmd文件分配的问题,您使用我下面的方式看一下,CanTestInit的地址是在哪里

  • 您好,按照您的测试,我运行结果如下:

     另外, 早期编译时报错,似乎是ram0空间不够,所以,我在cmd文件中改动了如下:

    RAMM0       : origin = 0x000050, length = 0x0009B0 // 从原来的3B0 -> 9B0;

  • 谢谢反馈,这样看起来是您的cmd文件定义问题

    请您参考下面的文件来修改一下

    software-dl.ti.com/.../sdto_cgt_Linker-Command-File-Primer.html

    software-dl.ti.com/.../ccs_files_in_projects.html
  • 谢谢,我先看看您贴的文件。但我仅仅是修改了cmd文件里面上面提到的那一句的长度;其他地方没动,都是例程里面默认的。
  • 这是cmd文件,例程中默认的。

    MEMORY
    {
    PAGE 0 :

    BEGIN :        origin = 0x000000, length = 0x000002 /* BEGIN is used for the "boot to SARAM" bootloader mode */
    RAMM0 :      origin = 0x000050, length = 0x0003B0 
    RAML0_L8 : origin = 0x008000, length = 0x00B800 /* on-chip RAM block RAML0-L8. From 0x13800 to 0x14000 is reserved for InstaSPIN */

    RESET : origin = 0x3FFFC0, length = 0x000002
    FPUTABLES : origin = 0x3FD590, length = 0x0006A0 /* FPU Tables in Boot ROM */
    IQTABLES :   origin = 0x3FDC30, length = 0x000B50 /* IQ Math Tables in Boot ROM */
    IQTABLES2 : origin = 0x3FE780, length = 0x00008C /* IQ Math Tables in Boot ROM */
    IQTABLES3 : origin = 0x3FE80C, length = 0x0000AA /* IQ Math Tables in Boot ROM */

    BOOTROM : origin = 0x3FF3B0, length = 0x000C10


    PAGE 1 :

    BOOT_RSVD : origin = 0x000002, length = 0x00004E /* Part of M0, BOOT rom will use this for stack */
    RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
    USB_RAM : origin = 0x040000, length = 0x000800 /* USB RAM */
    }

    PAGE 1 :

    BOOT_RSVD : origin = 0x000002, length = 0x00004E /* Part of M0, BOOT rom will use this for stack */
    RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
    USB_RAM : origin = 0x040000, length = 0x000800 /* USB RAM */
    }


    SECTIONS
    {
    /* Setup for "boot to SARAM" mode:
    The codestart section (found in DSP28_CodeStartBranch.asm)
    re-directs execution to the start of user code. */
    codestart : > BEGIN, PAGE = 0
    ramfuncs : > RAMM0,
    LOAD_START(_RamfuncsLoadStart),
    LOAD_END(_RamfuncsLoadEnd),
    RUN_START(_RamfuncsRunStart),
    LOAD_SIZE(_RamfuncsLoadSize),
    PAGE = 0
    .text : > RAML0_L8, PAGE = 0


    .cinit : > RAMM0, PAGE = 0
    .pinit : > RAMM0, PAGE = 0
    .switch : > RAMM0, PAGE = 0
    .reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */

    .stack : > RAMM1, PAGE = 1
    .ebss : > RAML0_L8, PAGE = 0
    .econst : > RAML0_L8, PAGE = 0
    .esysmem : > RAML0_L8, PAGE = 0

    IQmath : > RAML0_L8, PAGE = 0
    IQmathTables : > IQTABLES, PAGE = 0, TYPE = NOLOAD

    /* Allocate FPU math areas: */
    FPUmathTables : > FPUTABLES, PAGE = 0, TYPE = NOLOAD


    Cla1Prog : > RAML0_L8, PAGE = 0
    unsecure_data : > RAML0_L8, PAGE = 0

    编译错误信息如下:

    line 115: error #10099-D:
    program will not fit into available memory. placement with
    alignment/blocking fails for section ".cinit" size 0x948 page 0. Available
    memory ranges:
    RAMM0 size: 0x3b0 unused: 0x37a max hole: 0x37a
    error #10010: errors encountered during linking; "proj_lab13b.out" not built

    下面是目前在默认的cmd文件配置下得到的map allocation图,请帮忙分析。

  • 最终确认是程序太大了。屏蔽掉一些程序,一切正常了。

  • 很高兴您能解决问题!