Tasking编译器开发TC275(Tricore)中使用自定义段

Tasking编译器使用的不是GCC那套链接脚本语言,自创了一个LSL脚本语言。所以GCC那套链接脚本语法就不好使的。如果你在用Tasking编译并且需要用自定义段的话,你肯定不知道咋搞,因为网上没公开没资料。。。。只有个非常简单的Tasking的Linker使用手册,并不能满足从链接脚本中导出符号 给到C源文件中使用。这个问题我花了一天的时间解决了。

看代码吧

假设条件:假定想添加只读段的名称是.text.myrodata
        1.在链接脚本文件中text group中修改成如下代码:
        group  (ordered, run_addr=mem:pfls0)
        {
            select "(.text.myrodata)"; //这里记得加括号!!!
            select ".text*";
        }
        2.在本文件中添加如下代码:
        extern uint32_t _lc_ub__text_myrodata;//段的起始地址 规则:_lc_ub_ + 段名   遇到点 用下划线代替点所以生成的是_lc_ub__text_myrodata
        extern uint32_t _lc_ue__text_myrodata;//段的结束地址。
        3. 在任何一个C文件中定义变量
        __attribute__((section(".text.myrodata")))  Type TestValue=X;//如:__attribute__((section(".text.myrodata")))  int TestValue=5; 

        二.添加自定义data段教程:

        假设条件:假定想添加data段的名称是.data.mydata
        1.在链接脚本文件中data_bss group中修改成如下代码:
#       if LCF_DEFAULT_HOST == LCF_CPU2
        group data_bss(ordered, contiguous, align = 4, attributes=rw, run_addr = mem:dsram2)
#       endif
#       if LCF_DEFAULT_HOST == LCF_CPU1
        group data_bss(ordered, contiguous, align = 4, attributes=rw, run_addr = mem:dsram1)
#       endif
#       if LCF_DEFAULT_HOST == LCF_CPU0
        group data_bss(ordered, contiguous, align = 4, attributes=rw, run_addr = mem:dsram0)
#       endif
        {
            select "(.data.mydata)";
            select "(.data|.data*)";
            select "(.bss|.bss*)";
        }  
        2.在本文件中添加如下代码:
        extern uint32_t _lc_ub__data_mydata;//段的起始地址
        extern uint32_t _lc_ue__data_mydata;//段的结束地址。
        3. 在任何一个C文件中定义变量
        __attribute__((section(".data.mydata")))  Type TestValue=X;//如:__attribute__((section(".data.mydata")))  int TestValue=5; 

 

假定你想导出".data.mydata" 段的起始地址和结束地址,那么链接器生成的导出符号必定是_lc_ub__data_mydata(起始地址)_lc_ue__data_mydata(结束地址)

网上现在所有公开的资料上都没有说,我也是花了很长的时间才得到的。

规则:

起始地址:_lc_ub_ + 段名

结束地址:_lc_ue_ + 段名 

遇到点 用下划线代替

 

用处?

比如你上个项目上用了22 31 34三个服务,这个项目上只有31 34服务,22服务不用了。这些服务你通常会定义成数组。那你如果使用C数组,那么你的需要定义LEN宏定义,然后修改某个cfg源文件。带来了耦合。

用我的这种方法的话就非常简单:

//service22.c
__attribute__((section(".data.uds.service"))) UDS_Service_t service22=
{
    .Service=service22_callback,
};

如果项目中不需要22服务的话,直接把service22.c文件删掉,或者把后缀名改成其他格式的,比如我通常改成service22.c.no这样编译器生成makefile的时候就不会把service22.c.no编译进去。其他啥也不用改。

你可能感兴趣的:(单片机)