找回密码
 注册
关于网站域名变更的通知
查看: 220|回复: 1
打印 上一主题 下一主题

ARM学习笔记

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-5-20 09:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
ARM程序的开发中,需要大量读写硬件寄存器,尽量缩短程序的执行时间,因此部分初始化代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。& C5 A8 s$ `! T( G0 @

$ E4 v4 f# V& CC语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。+ W( b" \3 m6 Z0 b) H" v- Z

" ^7 p" k, V* z# EARM使用C语言编程基本规则
3 \* _' t3 f, U" w# v! e2 k' m3 T5 i3 [! N$ ^
在应用系统的程序设计中,若所有的编程任务均由汇编语言来完成,其工作量巨大,并且不易移植。由于ARM的程序执行速度较高,存储器的存储速度和存储量也很高,因此,C语言的特点充分发挥,使得应用程序的开发时间大为缩短,代码的移植十分方便,程序的重复使用率提高,程序架构清晰易懂,管理较为容易等等。因此,C语言的在ARM编程中具有重要地位。
+ \! s$ p% x( U' M8 b* B/ `$ K& w- y  n9 ]7 M8 L8 `8 f( W
在ARM程序的开发中,需要大量读写硬件寄存器,尽量缩短程序的执行时间,因此部分初始化代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。* t3 r7 O3 t1 U  M/ s+ }8 I

0 G3 N* s7 r0 V+ J/ M" I  `% MC语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。
, k  r! `& Q- T* j- D  U# [
8 E* T& I- w4 j5 N在使用C语言时,有时要用到和汇编语言的混合编程。当汇编代码较为简洁,则可使用直接内嵌汇编的方法,否则,将汇编程序以文件的形式加入项目当中,通过ATPCS(ARM/Thumb Procedure Call Standard)的规定与C程序相互调用与访问。, r# K: \. o& p* }" G
  J5 E9 Y. ?' \; H2 ]0 }
ATPCS,就是ARM、Thumb的过程调用标准,它规定了一些子程序间调用的基本规则。如寄存器的使用规则,堆栈的使用规则,参数的传递规则等。7 ?$ u8 C& d  U- P  ?( i* d' M& T1 I
& `$ o; Q! U1 b& B
在C程序和ARM的汇编程序之间相互调用必须遵守ATPCS。而使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS的规则。但是,对于汇编语言来说,完全要依赖用户保证各个子程序遵循ATPCS的规则。具体来说,汇编语言的子程序应满足下面3个条件:0 C4 U) t5 {, G) b3 [7 }- @4 x- h
; A. j. @/ l5 s5 S6 g
.  在子程序编写时,必须遵守相应的ATPCS规则;
4 g. C1 b" l  E9 k" V
+ ^5 S; O: E0 _& T.  堆栈的使用要遵守相应的ATPCS规则;
" A: U3 [3 Z) _, c6 k+ q8 G* s  ^+ O) E
.  在汇编编译器中使用-atpcs选项。; w  q6 n  R' r/ w/ c
4 C) f. n6 O' s9 t2 L
基本的ATPCS规定,详情请见相关PDF文档,简单说明就是:3 a; K+ g; n/ H2 L/ \

! n" P7 b7 o$ r/ _; m1. 汇编程序调用C程序
5 W3 U1 |5 h3 g% C4 J9 L/ x1 P) p( a: C" T# @! P! W
.  汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。! l1 k+ Z. ]7 c3 H; e0 [; F- f9 ~
% L/ b. O" N! l: n" d4 M
.  在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数。$ i. c! e" w& y

' d  z- |7 Z; X% q.  在调用C程序时,要正确设置入口参数,然后使用BL调用。7 C2 V' b. d$ y7 D! Y( H8 k8 ^6 K) k

; S8 g- L3 d3 p: T% a3 V1 f2. C程序调用汇编程序6 d+ l+ |/ B2 v: p% i
6 Y+ ~+ F  q5 o! L) n: r
.  汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。
3 K! s- z2 V; I% X% O$ c; \- e( i* ^6 J& r8 O! c- [* z+ c
.  在汇编程序中使用EXPORT伪指令声明本子程序,使其他程序可以调用此子程序。
# R3 H. l5 r  {1 h4 K
- s* \3 V1 x2 |9 K& L1 x8 e) p.  在C语言中使用extern关键字声明外部函数(声明要调用的汇编子程序)。8 e2 ]9 ^8 E' ^7 F) A. I

$ e! c% A- A- N# T$ x" n在C语言的环境内开发应用程序,一般需要一个汇编的启动程序,从汇编的启动程序,跳到C语言下的主程序,然后,执行C程序,在C环境下读写硬件的寄存器,一般是通过宏调用,在每个项目文件的Startup2410/INC目录下都有一个2410addr.h的头文件,那里面定义了所有关于2410的硬件寄存器的宏,对宏读写,就能操作2410的硬件,具体的编程规则同标准C语言。1 U5 j# V1 C! j
# Y5 ^. O- `! K% o; }' r# i

& V5 x7 a6 l# q3 b: m  F! m: l. r$ ]# S& k8 C# r
ARM Cortex™ 微控制器软件接口标准(CMSIS:CortexMicrocontroller Software InteRFace Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层。' }& L! E0 K: ]- X! Q: Z' M: i
! G& q9 `9 [0 |* Q4 t
: |( @: B4 ?* V: `! \

* ]* x) h# ]6 I2 ?% e  T; C3 b) M6 }* B- k& Y5 `+ W0 R/ `
' _8 f0 a8 v' k% m4 p
基于CMSIS标准的软件架构主要分为以下4层:用户应用层、操作系统及
3 W8 ], v' m! `/ v7 a4 B, l( j  Q9 X6 E* K( M" z4 B2 _1 v
中间件接口层、CMSIS层、硬件寄存器层。其中CMSIS层起着承上启下的作用:一方面该层
. r" ^6 e) P( f4 I
  u1 N2 f; Z* L7 A对硬件寄存器层进行统一实现,屏蔽了不同厂商对Cortex‐M系列微处理器核内外设寄存器0 ]+ }' D4 |1 r

) m1 g- C/ r, A# z' ]2 N的不同定义;另一方面又向上层的操作系统及中间件接口层和应用层提供接口,简化了应用9 t2 E3 S4 l5 u9 ~0 N  `

2 U7 r/ b) j& |  ?( h程序开发难度,使开发人员能够在完全透明的情况下进行应用程序开发。也正是如此,CMSIS
9 R" h/ B. V5 u) g% C* P
. g4 k; k& B8 p, F+ m& A# ~层的实现相对复杂。6 I& h, ?9 A4 E0 W+ A! D
( Y% D5 t- m0 j$ z: n8 y4 {6 x

" B7 g. ~5 Q0 {) N4 _  y; s" L$ ]+ {- u1 D
stm32f10x.h:CMSIS 的6 f$ N6 N. ^  |& F# U, u3 \

. j" G3 }/ y' p3 XCortex‐M3 STM32f10xxx微4 U! b$ o9 i) q3 `. Y4 p3 Y
- n7 K( ?" Q/ T3 I  _* G1 @& m
控制器外设访问层头文件7 t6 N$ L8 q8 D  B
/ Q, U1 v4 y* y7 r
system_stm32f10x.h :
# j+ C7 A' y4 n  V$ A# z1 H! M+ }1 n" w0 U( g- A
CMSIS 的 Cortex‐M3# ]4 @5 z4 T- ]' Q) G
4 q! y0 K2 Y8 L+ h9 \, P
STM32f10xxx 微控制器外
- L5 f1 O1 B. u4 I: S+ z) X' S5 |+ d; p$ w( v# \
设访问层头文件( w) N) B) M/ K$ T4 T/ c# m. l, H( E
9 n5 G4 }1 l! H, Z+ U: f1 w
system_stm32f10x.c :
9 W; k! X9 i  H4 p5 Z- p& k
+ i9 G; P7 [4 }/ y4 Q/ dCMSIS 的 Cortex‐M3
; s) |" n; W# m* ^+ {9 W9 I
, W" l5 J2 g6 mSTM32f10xxx 微控制器外
4 p! y7 Q: E" ~( K# U: K3 p2 \7 N8 w' n4 k8 D) E$ d4 d% Q+ U; s
设访问层源文件
3 `6 U2 Z' \) l0 x1 q2 ^3 E6 X; A( \% t+ R# H
0 K1 x8 M+ |- O, n' U/ l
# L9 C; g# _; K/ V
首先新建一个项目并设置工具链对应的启动文件,可以使用标准外设库中提供的模板,也可3 D1 w* o% j; A" h( B6 r' b" u5 `

2 E3 M( {6 x4 `" G以自己根据自己的需求新建。标准外设库中已经提供了不同工具链对应的文件,位于
, V% Q; e: |' n% F1 I4 I& v* a2 U* ~7 `+ |" a% L
STM32F10x_StdPeriph_Lib_V3.4.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup
& T! M; @- W% X! s# _+ ^" _# h, i6 u- n- t0 W/ Z* ]* }4 }0 y
6 }5 E0 L( U# F8 r- b- i  h7 j
& w4 E1 j6 C5 }+ H" i! ^$ _: [
目录下。
* y$ @& t$ Y/ m% H% ~! p
% q/ E2 Z, u; _其次按照使用产品的具体型号选择具体的启动文件,加入工程。文件主要按照使用产品的容
$ x; d: M/ W8 Z7 x& L) e- w- x
2 v. V. o0 S- I0 v" s* m; w量进行区分,根据产品容量进行选择即可。; W3 T) P; h* L1 U

1 @4 l3 z. F3 C! t! d
, e6 C- Z( T2 B3 }! E9 ?+ g7 b, ?  A& F( {+ F4 j

: e+ W/ c; X' Q, b, e. R3 I
1 ~7 i' p# {, @! fstm32f4xx_it.h外设中断函数文件 用户可以相应的加入自己的中断程序的代码,对于指向同一个中断向量的多个不同中断请求,用户可以通过判断外设的中断标志位来确定准确的中断源,执行相应的中断服务函数
8 J4 D7 v' s$ H1 x2 g│  system_stm32f4xx.c  文件  函数Sysem_ExtMEMCtl,用来配置外部存储器控制器。它位于文件startup_stm32f10x_xx.s /.c,在跳转到main前调用 SystemFrequncy,该值代表系统时钟频率
) }4 i0 l6 S7 v7 S% ~$ I
; h. K1 c  @; L* ?$ z
3 K4 z) j* ], G# w* z: m
, A8 I& ^2 `& K) ?/ t, Z) g  f
1 D7 [  K+ j0 U+ y' O* M+ I) H# a" n. a; T- ~0 B5 z& L* u
Libraries\STM32F10x_StdPeriph_Driver\下的内容很好理解就是stm32的各个6 R( W3 S. J3 _% S- [! Y

0 V$ j3 _5 f" U: R2 y% \, B外设模块驱动代码。
9 j. C  `; }) M  ]0 `3 T$ j  \, Y' q1 e; V+ Q1 f/ {4 b6 K$ |
misc.h和misc.c是和CM3内核有关的NVIC和SysTick的驱动代码。: I  Q! |& m! s# x
. [' o! a5 X/ [. C9 z9 @9 G
Libraries\CMSIS下是什么呢?cmsis英文全称:CortexMicrocontroller
7 o0 Q' Y; h& I% I  _4 F+ j3 ?$ J8 C* O" `- V  ?8 r2 ]( o
Software Interface Standard,是Cortex系列处理器硬件抽象层,可以理解为cortex; A$ G- l  \2 M# z

/ t% d4 [3 l7 @$ t0 |: W2 u. Q, Z9 Y内核的软件接口。/ b9 |/ v7 }0 `0 p5 C7 I6 S
3 a* r' y& P7 b+ T, u8 D3 U' U
core_cm3.c, core_cm3.h& m' y% Z3 j8 u) ^( {

8 n& `" E4 L' S7 s它们的目录名为CoreSupport,说明这两个文件是CM3内核支撑文件,其他使
( e; \, ]1 i  q  t# Q2 o3 s. X- y, Q* ^* q) M
用CM3内核的芯片也可以用,不一定是stm32。这两个文件用来获取设置CM3内3 s7 ]& o3 L0 U! G

( h, {! c) f( _9 @" f核,配置一些内核寄存器。
( p* ]  A- b7 J! q* u
+ [  L, Y0 I& `1 x6 {stm32f10x.h, system_stm32f10x.c,system_stm32f10x.h和& o/ J" a, `! D' j! q  M9 s
3 g4 H- J; ?- ]) G' v
startup_stm32f10x_hd.s在DeviceSupport目录下,说明这几个文件是和具体的芯5 Q' o. b& f5 A/ R% P
# }& W+ m8 g  Q: A
片有关的,也就是stm32芯片的支撑文件。其中stm32f10x.h是标准外设库的入口,# o  A) {$ l! _" p4 y2 X! e$ o

2 n" l" q' ]* v, `使用标准外设库的代码中必须包含该头文件。system_stm32f10x.c,- O/ R" b! M8 P# ?5 I" I

: n1 K4 d. F: Vsystem_stm32f10x.h这两个文件提供函数用来初始化stm32芯片,配置PLL、系7 l7 I; `' W- {1 W1 n
* S+ }. n: j8 X3 f
统时钟和内置flash接口。startup_stm32f10x_hd.s是大容量型stm32芯片的启动3 k3 M4 x! G) Y) ^- M# p& p
# I8 T. D6 a; H9 A1 }4 K; Z+ J
文件
1 s6 N+ |' x* F- a/ T: ~
# h4 B1 z, Y8 F2 m: V' J
7 t: [# N" J0 m' k( X2 Y/ V; O2 k% x1 o6 a0 K
stm32f10x_it.c,stm32f10x_it.h是中断服务程序文件。stm32f10x_conf.h是标
0 L9 j/ t6 F0 F* J0 D
, i2 O3 }( F1 r9 @准外设库的配置文件,对于工程中不需要的外设,可以注释掉里面的包含的头文件。
9 y( y6 i/ l+ X: ]- c! Y
9 U1 E+ v" Z- j) ^& E- C: M这里我建议先仅留下stm32f10x_gpio.h,stm32f10x_rcc.h,misc.h,用到什么再打& F: F5 ]  ^  a( d1 R
" d4 N# G9 r+ R% O5 ?
开什么,这样编译起来快一点,当然也可都留着。
3 H, }. C# n( g+ y, }4 o
* |# ]5 {4 J. ?! j5 p4 a+ ~7 f4 y5 p  j. k! E# h1 j
; y' p$ u* S0 ~+ [

该用户从未签到

2#
发表于 2020-5-20 10:29 | 只看该作者
汇编程序调用C程
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-3 11:30 , Processed in 0.093750 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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