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.

[参考译文] CCS/TMS320F28023:将跳转表放置在第0页的闪存中

Guru**** 2529560 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/797864/ccs-tms320f28023-put-jump-table-in-flash-on-page-0

器件型号:TMS320F28023

工具/软件:Code Composer Studio

Win7 (SP1)、CCS 6。

我正在使用"函数跳转表"进行程序、我很难将该表放置在第0页的程序部分(.text)中。

我的程序从串行端口接收范围为"0"..Z"的 ASCII 字节、然后根据该字节、我要跳转到43个不同的函数。

理想情况下、我希望将表放在.text 段中的某个位置。 实际位置不重要。

这是我目前为止所拥有的、并且这起作用...

以下是 Menu_Commands.def 的部分内容

/* 0 */ GetParagraphs,
/* 1 */ GetDirect,
/* 2 */ PutDirect,
/* 3 */...(更多40个) 

对应的 FunctionCallTable 的声明如下所示...

#pragma DATA_SECTION (FunctionCallTable、"FuncctCodeTbl");
静态空(* FunctionCallTable[])(空)={
#include "Menu_Commands.def"//请参阅上面的*/
}; 

最后、实际跳转的代码...

if ((byte1 >="0")&&(byte1 <='Z'){
字节1 -='0';
FunctionCallTable[byte1]();
} 

我在第1页的闪存中创建了一个存储器区域、然后我创建了一个段(如上所示)、这样做是可行的、但问题是编译器或链接器在.cinit 段中创建了一组条目、因为它认为这是需要初始化的数据。 更不用说留出一些闪存的所有工作、以便两个存储器区域不会重叠。

因此、我尝试用以下内容替代该 pragma ...

#pragma CODE_SECTION (FunctionCallTable、".text"); 

但我收到一个编译器错误、提示...
"n:/Standalone/Piccolo-28022/Src/MainSub.c、第81行:警告#1111-D:pragma CODE_SECTION 只能应用于函数定义、而不能应用"FunctionCallTable"(在第83行声明)

请、有人能告诉我如何将其设置为直线吗?

我已经考虑在汇编器中编写所有这些内容、我确信我可以这样做、但我宁愿让 C 编译器来处理它。

我还有一个问题、这可能需要一个单独的线程、但它的关系很松散。

我遇到链接器错误...

"n:/Standalone/Piccolo-28022/CMD/_Standalone (general).cmnd"、第301行:错误#10099-D:程序不能放入可用内存中。 针对大小为0x56的"FunctCodeTbl"段运行对齐/分块放置失败第1页。 可用存储器范围:
F_FUNTABL 大小:0x60 未使用:0x60 最大孔数:0x60

如您所见、所需的量为0x56、空穴为0x60。 我还没有弄清楚这一点。

感谢您在这方面的任何帮助、
标记

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    ***代码***_SECTION,因此您会对将此 pragma 与数据一起使用感到不满。 函数指针数的数组仍然是数据、而不是函数。 请改用#pragma DATA_SECTION。 我将使用 DATA_SECTION 在自定义区域中放置一些常量。

    Edward
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我假设您希望 将 FunctionCallTable 直接编程到闪存中、而不是像显式初始化的其他每个全局变量一样从闪存复制到 RAM 中的某个位置。  为此,您需要使函数表常量...

    #pragma DATA_SECTION (FunctionCallTable、"FuncctCodeTbl");
    静态空(* const FunctionCallTable[])(void)={ 

    请注意添加 const。  我假设还有其他数据段在闪存中编程。  以相同的方式处理段 FunctCodeTbl。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    乔治:

    按广告宣传的那样工作。

    我注意到.cinit 段中减少了0x59个字。 非常好。

    我试图在静态和无效之间,或者在静态之前,两者都不起作用。

    我不想在星号和函数名称之间放置。

    我有其他数据 pragma、其中有 const 一词、它们是可以的。

    我测试了如何完全删除 pragma、并且 FunctionCallTable 最终在闪存中的.econst 中结束、因此这也使我的生活变得更加轻松。 我不再需要在链接器中创建单独的存储器或段部分。

    感谢你的帮助。

    标记。