ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

基于STM32从零写操作系统系列---使用C语言

2022-10-16 16:48:35  阅读:257  来源: 互联网

标签:基于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段的属性是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的值。

标签:基于STM32,系统系列,使用C语言
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有