基于stm32的c语⾔编程,基于STM32从零写操作系统系列---使
⽤C语⾔
⽬的
C语⾔,相对于汇编有更好的可读性,便于维护等优点。下⾯实验将使⽤C语⾔实现点亮LED灯。C语⾔与硬件是紧密连在⼀起的,结合芯⽚中的flash和sram,简单了解C语⾔。
要求
1.有⼀定的C语⾔基础
2.了解编译链接脚本
3.了解stm32F103的硬件结构
实验源代码在这下载,代码中有详细注释!
分析
1.⾸先了解硬件,如图
FLASH,就是存放.bin⽂件的地⽅。SRAM,⽤于存放程序的堆栈,全局变量。
2.了解链接脚本,如图:
MEMORY,⽤于定义存储器范围。
AT>rom,表⽰将对应的SECTION放置到rom中,即Flash中。
_data_start / _data_end,⽤于说明data段在flash中的位置,⽅便程序将data段从flash中复制到sram中。为什么要复制data段到sram 中呢?由于flash定义为rx属性,即只读、可执⾏。data段的属性是rw
x,即可读写、可执⾏。所以如果data段放在flash中,程序运⾏时,给全局变量赋值就会产⽣异常。
_ram_data_start,表⽰data段将复制到sram中的什么位置。
ADDR(),表⽰获得SECTION的运⾏地址vma,如ADDR(.data),表⽰data段的运⾏地址0x20000400;即,data段将在sram中运⾏。所以当程序被下载到flash后,程序开始运⾏时⾸先要将data段移动到sram中0x20000400地址处,这样程序运⾏时才不会出错。
LOADADDR(),表⽰获得SECTION的加载地址lma,如LOADADDR(.rodata),表⽰rodata段的加载地址。即,表⽰rodata段在flash中的地址。
SIZEOF(),⽤于求SECTION的⼤⼩
整个SECTIONS,可以看做是程序在flash中的布局,其中.bss不占⽤flash空间,它是由程序中开始运⾏时,在sram中开辟空间并初始化为0。
各个SECTION,如.data.data.bss,分别存放不同类型的数据。
3.如何复制data段到sram,如图:
c语言下载什么4.初始化bss段,如图:
5.⽤C语⾔编写的led程序,主要是了解C语⾔中的全局变量,局部变量放在哪⾥。如图:
6.从反汇编.list⽂件中可以看到,上⾯这些数据放在什么地⽅,如图:
7.led.h头⽂件定义了寄存器,如图:
本质就是C语⾔中的指针操作,volatile作⽤是确保本条指令不会因编译器的优化⽽省略。如代码“RCC_APB2ENR |=
0x00000010;”,表⽰向寄存器的第4位(从0位开始计数)写1。
⼩结
本章主要了解硬件与软件之间关系,如,程序有多个section,他们有的放在flash中,有的放在sram中;程序有运⾏地址vma和加载地址lma,所以下载程序时要将程序下载到对应的加载地址上的,程序运⾏时需要将程序放到正确的运⾏地址上。源代码已分享,可⾃⾏下载编译调试,通过调试程序,观察程序如何在flash和sram上运⾏。如,通过gdb的调试指令,可以查看局部变量h的值。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论