【IMX6UL】加上“清除BSS段”代码,程序不运行,删除“清除BSS段”代码,程序运行。

王大大 2023-06-09 11:26:19

问题描述:

加上“清除BSS段”代码,程序不运行,删除“清除BSS段”代码,程序运行。之前一直都有使用这段代码,以往的程序都可以正常运作,但在这次项目中却出现了问题。

相关代码如下:

SECTIONS{
    . = 0X87800000;
    .text :
    {
        obj/start.o 
        *(.text)
    }
    .rodata ALIGN(4) : {*(.rodata*)}     
    .data ALIGN(4)   : { *(.data) }    
    __bss_start=.;    
    .bss ALIGN(4)  : { *(.bss)  *(COMMON) }    
    __bss_end=.;
}

BSS的反汇编结果截图如下:

在这里插入图片描述


原因分析:

一、BSS代码的链接脚本出现格式错误

相关代码如下:

    __bss_start=.;    
    ...
    __bss_end=.;

二、寄存器地址问题,0X87800289不属于BSS段,需要对__bss_start进行四字节对齐。对于32位的SOC来说,一般访问是4字节访问的。地址末尾必须是0X0,0X4,0X8,0XC。这里BSS的起始地址是以0X9结尾,所以芯片处理的时候以4字节访问会从0X87800288开始清除BSS段,之前使用这段代码没有出现问题应该是在0X87800288这个地址位置没有存放数据,而现在LED灯无法正常工作是因为这里存放了数据却被清除。


解决方案:

  • 定时计数器和赋值符号前后要有空格

修改后代码:

    __bss_start = . ;    
    ...
    __bss_end = . ;
  • 按照四字节对齐的原理,__bss_start应该是0X8780028C。需要设置__bss_start为四字节对齐。修改后的代码如下:
SECTIONS{
    . = 0X87800000;
    .text :
    {
        obj/start.o 
        *(.text)
    }
    .rodata ALIGN(4) : {*(.rodata*)}     
    .data ALIGN(4)   : { *(.data) }    
    . = ALIGN(4); /* 加上这段代码的作用是使BSS起始地址重新以四字节对齐,即0X8780028C */
    __bss_start = . ;    
    .bss ALIGN(4)  : { *(.bss)  *(COMMON) }    
    __bss_end = . ;
}

...全文
188 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3

社区成员

发帖
与我相关
我的任务
社区描述
理无专在,而学无止境也,然则问可少耶?
linux物联网开放原子 个人社区
社区管理员
  • Quinn27
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

本社区在“NXP开发板”和“ST开发板”两个板块下有明确的发贴标题起名要求!

如果发帖的标题不符合社区规则,将立刻删除贴子,麻烦各位大佬们注意一下这个问题!

“NXP开发板”和“ST开发板”板块:标题格式:【开发板型号】+ 问题描述/知识分享/吐槽内容。

参考如下:

  • 【IMX6ULL】我的板子遇到了报错内容“xxxx”,有大佬分享一下解决办法吗?
  • 【STM32MP135】我的板子遇到了报错内容“xxxx”,有大佬分享一下解决办法吗?

发帖建议:

  1. 问题描述要清晰,遇到报错,直接将报错内容写在标题里!
  2. 提问要谦虚,问题解决后要及时回帖!

试试用AI创作助手写篇文章吧