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.

CCSTUDIO-C2000: 定义了没有被main函数调用的函数,放到指定的flash扇区中,编译之后发现.map文件中没有出现定义的函数,相应的flash扇区used也为 0

Part Number: CCSTUDIO-C2000

#pragma CODE_SECTION (fun1,"fun1_addr")

#define fun1add (void (*)(void)) 0x3EC000    //放到flash扇区F  CMD中的flash扇区F起始地址为0x3EC000 

void fun1()

{

    XXXX.....

}

在CMD SECTIONS中加入

fun1_addr             : >FLASHF,            PAGE =0 

编译之后 .map文件中FLASHF的used显示为0,GLOBAL DATA SYMBOLS里也找不到_fun1

在main函数中加入下面两行代码,

Uint32 a;

a=(Uint32)&fun1;

编译之后 .map文件中FLASHF的used就有长度了,GLOBAL DATA SYMBOLS里也有_fun1了,请工程师和各位大佬解答一下。这是为啥,怎么处理fun1写不进flash的问题。

eg:CCS的优化是off状态,0级优化下加入上面两行代码编译,fun1也写不进flash里了。

  • 您好,fun1是如何声明及定义的?

  • 直接在main.c定义了fun1

    void fun1()

    {

        函数体

    }

    在main函数里没有直接调用fun1,所以就没有声明,而且fun1的定义是在main函数之前的

    在main函数最后是一个if语句,条件为真的话跳转到fun1函数中执行。

    if(xxx)

    {

        (*fun1add)();

    }

    也试过在main函数中加入

    void fun1();

    声明,但是编译之后map文件中看到相应flash位置依然没有被写入。flashf 的used依然是0.

  • 看过了,但是感觉对我的问题没有任何帮助啊,我用#pragma CODE_SECTION 将fun1放到指定位置,但不在main函数中调用,需要在某种条件时根据放置的flash地址通过函数指针(*fun1add)()将程序从main函数跳转到fun1函数运行,但是想在编译之后dsp没有在我#pragma CODE_SECTION (fun1,"fun1_addr")中的fun1_addr的地址写入fun1程序,我在cmd文件中的section也添加了fun1_addr  :> FLASHF,  PAGE = 0  的,不知道这是什么原因引起的,而且ccs的代码优化功能也是关闭的,怎么解决这个问题呢

  • 您试一下在main函数中调用该函数,然后看一下该函数有没有按照预期的那样放入指定地址

  • 在main函数中加入

    Uint32 a;

    a=(Uint32)&fun1;

    这两句之后fun1就被放入指定的地址了,不加的话为什么会放不进去呢,这是什么原因引起的,怎么解决。

    因为我在main函数中时不希望用函数名直接调用的,我希望通过函数指针指定到函数的地址从main函数跳转到fun1函数中。

    加入上面的两行之后编译会产生一个变量a未被使用的警告、

  • #define fun1add (void (*)(void)) 0x3EC000    //放到flash扇区F  CMD中的flash扇区F起始地址为0x3EC000

    您的使用和我提供给您的手册中的用法有些出入,您把这句去掉试一下。

    加入上面的两行之后编译会产生一个变量a未被使用的警告

    不影响使用的话警告可以忽略。

  • #define fun1add (void (*)(void)) 0x3EC000    //这句话只是宏定义了一个指向函数的指针变量fun1add,去掉之后还是放不进指定的扇区。

    虽然警告不影响使用,但是我想知道为什么不在main函数中加入

    Uint32 a;

    a=(Uint32)&fun1;

    时编译器会忽略掉#pragma CODE_SECTION (fun1,"fun1_addr")这句指令,不把fun1放到指定扇区,而加入之后可以。我并没有打开代码优化功能。

  • #pragma CODE_SECTION ( symbol , " section name ")

    section name处直接填写段名即可。

    另外请您按照手册中描述的那样,把函数的声明及定义分开尝试一下,我们尽量遵循手册,将其它影响因素降到最低。

    即使放置在if语句中,函数有没有被调用也是在程序运行时才能确定的事。出现这种状况确实很奇怪,我会和其他工程师讨论一下给您回复。

    再问一下您使用的是哪一款芯片?

  • 如果代码没有被引用,编译器将会优化它。我们的工程师推测即使它在if中,但是条件永远无法实现所以编译器会优化掉它。

    如果想要保留symbol,您可以尝试#retain pragma:

  • 谢谢您的回复,加入#pragma RETAIN (fun1) 之后问题解决了。关于优化的问题,我之前是关闭CCS代码优化功能的,是C语言的编译器将其优化掉了吗