发 帖  
原厂入驻New

嵌入式ARM开发环境下为什么要设置堆栈指针和清理BSS段?

80 ARM 嵌入式
分享
嵌入式ARM开发环境下,设置堆栈指针和清理BSS段的意义
0
2021-4-2 06:39:49   评论 分享淘帖 邀请回答

相关问题

1个回答
  以前稍微写过操作系统上的C程序,感受不出来:BSS段,堆栈的意义。到了在单片机上写程序也没有考虑这些问题。但是到了ARM上环境似乎没有那么简单了,C的环境要自己来创建,不然就不能用。这也深刻的感受到了C语言中原来难以理解的概念。
  裸机建立C语言环境-设置堆栈指针
  这个是使用C语言的首要条件,不过这个就是指定一个sp指针就可以了,很简单的。ldr sp, =4096。
  裸机建立C语言环境-清理BSS段
  如果C语言中用到的全局变量或者静态变量,这个编译的时候是把它们放到了BSS段,这个段在内存中。怎么建成的?手动写一个链接脚本,添加__bss_start __bss_end变量来表示BSS段的开始和结束。如下:
  SECTIONS {
  。 = 0x00000000;
  .text : { *(.text) }
  .rodata ALIGN(4) : AT((LOADADDR(.text)+SIZEOF(.text)+3)&~(0x03)) {*(.rodata*)}
  .data ALIGN(4) : AT((LOADADDR(.rodata)+SIZEOF(.rodata)+3)&~(0x03)) { *(.data) }
  __bss_start = 。;
  .bss ALIGN(4) : { *(.bss) *(COMMON) }
  __bss_end = 。;
  }
  这样在应用程序中清理__bss_start到__bss_end之间内在中的内容。这样全局变量就可以用了,否则会出现异常。我遇到的具体表现为:全局变量的值无法更改。代码可以学习u-boot中汇编方法清理:
  /*
  * These are defined in the board-specific linker script.
  */
  .globl _bss_start
  _bss_start:
  .word __bss_start
  .globl _bss_end
  _bss_end:
  .word __bss_end
  /*
  * 清BSS段
  */
  clear_bss:
  ldr r0, _bss_start /* find start of bss segment */
  ldr r1, _bss_end /* stop here */
  mov r2, #0x00000000 /* clear */
  clbss_l:str r2, [r0] /* clear loop.。. */
  add r0, r0, #4
  cmp r0, r1
  ble clbss_l
  mov pc, lr
  /* end_of clear_bss */
  也可以用C语言来实现:
  void clean_bss(void)
  {
  extern int __bss_start, __bss_end;
  int *p = &__bss_start;
  for (; p 《 &__bss_end; p++)
  *p = 0;
  }
  总结:就是往这段内存中写0.
2021-4-2 15:46:20 评论

举报

只有小组成员才能发言,加入小组>>

454个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /5 下一条

快速回复 返回顶部 返回列表