历史上的今天
返回首页

历史上的今天

今天是: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的值。

推荐阅读

史海拾趣

Giga公司的发展小趣事
如自动浇水系统、温度控制系统等,通过定时启动或关闭设备。
Cornerstone Sensors公司的发展小趣事

Cornerstone Sensors公司成立于电子行业的蓬勃发展时期。创立初期,公司就明确了以传感器技术为核心的发展方向。公司聚集了一批优秀的工程师和科学家,致力于研发高精度、高稳定性的传感器产品。经过数年的技术积累和产品研发,Cornerstone Sensors逐渐在传感器领域崭露头角,其产品质量和技术水平得到了行业的广泛认可。

思瑞浦微电子科技(3PEAK INCORPORATED)公司的发展小趣事

Cornerstone Sensors公司成立于电子行业的蓬勃发展时期。创立初期,公司就明确了以传感器技术为核心的发展方向。公司聚集了一批优秀的工程师和科学家,致力于研发高精度、高稳定性的传感器产品。经过数年的技术积累和产品研发,Cornerstone Sensors逐渐在传感器领域崭露头角,其产品质量和技术水平得到了行业的广泛认可。

ATP [ATP Electronics]公司的发展小趣事

为了适应全球市场的变化,ATP积极推进全球化战略。公司在美国硅谷设立总部,并在英国、台湾、中国大陆等地设立分公司,构建起了全球化的研发、生产和销售网络。这一战略布局不仅增强了ATP在全球市场的竞争力,也为公司带来了更多的合作机会和发展空间。

DATATRONICS公司的发展小趣事

DATATRONICS深知产品质量是企业生存和发展的基石。因此,公司投入大量资源用于建立和完善质量管理体系,确保每一款产品都符合国际标准和客户要求。同时,DATATRONICS还注重品牌形象的塑造,通过一系列营销活动和公益活动,提高了品牌知名度和美誉度。

AMS公司的发展小趣事

DATATRONICS公司自成立以来,一直致力于电子技术的研发与创新。某年,公司研发团队成功突破了一项关键技术瓶颈,开发出了一款高效能的数据处理芯片。这款芯片以其卓越的性能和稳定性,迅速获得了市场的认可。DATATRONICS借此机会,进一步扩大了产品线,提高了市场竞争力。

问答坊 | AI 解惑

ULINK 制作DIY资料

配合Keil for ARM的ULINK,让ARM开发完全摆脱ADS1.2。   Keil ULINK USB接口仿真器,一款多功能ARM调试工具,可以通过JTAG或CODS接口连接到目标系统仿真或下载程序,目前已经成为国内主流的ARM开发工具。    Keil ULINK的软件环境为Keil uVi ...…

查看全部问答>

[ZT]送给研发弟兄们几个总结性观点

观察了一些企业的产品技术情况,比较普遍的一个现象是:研发人员无一例外的同声谴责采购和工艺部门,对元器件控制不严,致使电路板入检合格率低、到客户现场后频频出毛病。     举几个简单例子:     一个电解电容 ...…

查看全部问答>

刚进入初级基带工程师,应该学什么?

刚刚进入基带这个行业,还有些摸不到头脑, 请问大家应该从哪里开始学起?…

查看全部问答>

wince5.0 开机读sd卡中内容不出来的问题

各位大虾,我们现在遇到这样的问题 就是我们的应用程序需要在开机就读sd中内容(SD是插入的) 但是启动后很长时间才能读到SD卡中的内容,想尽办法都改善不了啊。 是SDHC的标准驱动…

查看全部问答>

有没有人知道如何设置wince5内核能够让它支持sqlce3,高分求

wince5 下用visual studio 2005开发,涉及到sqlce设计,请问有没有知道如何设置wince5内核能够让它支持sqlce3,高分求…

查看全部问答>

哪位大虾帮忙看看这个keilC51程序,串口通讯相关的。

第一次写keil程序,还望不吝赐教。现在的问题是,仿真正常temp可以正确赋值,但是仿真到判断temp值的时候都是直接跳过,无法识别。将判断条件设为temp==0,可以触发也就是说,temp的值始终是0。 烧到51里实测也是一样一直停在 ENA=1;IN1=1;IN2=1; ...…

查看全部问答>

关于三星6410平台OpenGL

公司一直是基于三星6410平台的Windows Mobile操作系统,之前是没有集成OpenGL的,现在为了显示效果,准备加上,会对目前的系统产生什么影响?…

查看全部问答>

请问如何从U盘启动xpe系统?

我用windows embedded studio制作了一个迷你型的xpe系统,请问我如何能从U盘启动整个系统呢?我在网络上找过相关的一些方法,但是都不能顺利的完成。…

查看全部问答>

用0.3V废旧电池驱动LED

  利用一个0.3V左右的废旧电池,来驱动LED灯 ,40KHZ的脉冲。成本不超过1元!先将制作方法和电路图,再秀成果~ 步骤如下:        1.准备一个磁环,电子市场多得是,很便宜,1毛钱一个吧,不用太大,和指甲差不多大小就可以了 ...…

查看全部问答>