历史上的今天
今天是:2024年09月10日(星期二)
2019年09月10日 | 基于STM32从零写操作系统系列---使用C语言
2019-09-10 来源:eefocus
目的
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段的属性是rwx,即可读写、可执行。所以如果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,如.vectors.text.rodata.data.bss,分别存放不同类型的数据。
3.如何复制data段到sram,如图:

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的值。
史海拾趣
|
配合Keil for ARM的ULINK,让ARM开发完全摆脱ADS1.2。 Keil ULINK USB接口仿真器,一款多功能ARM调试工具,可以通过JTAG或CODS接口连接到目标系统仿真或下载程序,目前已经成为国内主流的ARM开发工具。 Keil ULINK的软件环境为Keil uVi ...… 查看全部问答> |
|
观察了一些企业的产品技术情况,比较普遍的一个现象是:研发人员无一例外的同声谴责采购和工艺部门,对元器件控制不严,致使电路板入检合格率低、到客户现场后频频出毛病。 举几个简单例子: 一个电解电容 ...… 查看全部问答> |
|
各位大虾,我们现在遇到这样的问题 就是我们的应用程序需要在开机就读sd中内容(SD是插入的) 但是启动后很长时间才能读到SD卡中的内容,想尽办法都改善不了啊。 是SDHC的标准驱动… 查看全部问答> |
|
有没有人知道如何设置wince5内核能够让它支持sqlce3,高分求 wince5 下用visual studio 2005开发,涉及到sqlce设计,请问有没有知道如何设置wince5内核能够让它支持sqlce3,高分求… 查看全部问答> |
|
第一次写keil程序,还望不吝赐教。现在的问题是,仿真正常temp可以正确赋值,但是仿真到判断temp值的时候都是直接跳过,无法识别。将判断条件设为temp==0,可以触发也就是说,temp的值始终是0。 烧到51里实测也是一样一直停在 ENA=1;IN1=1;IN2=1; ...… 查看全部问答> |
|
公司一直是基于三星6410平台的Windows Mobile操作系统,之前是没有集成OpenGL的,现在为了显示效果,准备加上,会对目前的系统产生什么影响?… 查看全部问答> |
|
我用windows embedded studio制作了一个迷你型的xpe系统,请问我如何能从U盘启动整个系统呢?我在网络上找过相关的一些方法,但是都不能顺利的完成。… 查看全部问答> |
|
利用一个0.3V左右的废旧电池,来驱动LED灯 ,40KHZ的脉冲。成本不超过1元!先将制作方法和电路图,再秀成果~ 步骤如下: 1.准备一个磁环,电子市场多得是,很便宜,1毛钱一个吧,不用太大,和指甲差不多大小就可以了 ...… 查看全部问答> |




