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

ARM学习笔记

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
ARM程序的开发中,需要大量读写硬件寄存器,尽量缩短程序的执行时间,因此部分初始化代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。9 P/ `1 n' p0 ~+ ^8 Z
" ?# F7 F4 g: m0 K2 p% E' P/ F5 V3 F
C语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。
, f+ a1 o/ b+ h! `' i
1 P2 m1 R% o, d+ ?  ^ARM使用C语言编程基本规则
; ?" W  y' p9 o  Z" a( a2 S* Z5 ?- B% C( {' j
在应用系统的程序设计中,若所有的编程任务均由汇编语言来完成,其工作量巨大,并且不易移植。由于ARM的程序执行速度较高,存储器的存储速度和存储量也很高,因此,C语言的特点充分发挥,使得应用程序的开发时间大为缩短,代码的移植十分方便,程序的重复使用率提高,程序架构清晰易懂,管理较为容易等等。因此,C语言的在ARM编程中具有重要地位。
+ b8 K9 M  u& J. i# z  v' B- K9 V% Y* ^- `7 w
在ARM程序的开发中,需要大量读写硬件寄存器,尽量缩短程序的执行时间,因此部分初始化代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。- r3 b6 e3 a: X; W9 j
( q1 l/ ]* I+ R$ l; V, Q5 E+ ]
C语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。
, L7 {5 D5 @' k( ^
. l( G9 S" H" w# t$ t2 H在使用C语言时,有时要用到和汇编语言的混合编程。当汇编代码较为简洁,则可使用直接内嵌汇编的方法,否则,将汇编程序以文件的形式加入项目当中,通过ATPCS(ARM/Thumb Procedure Call Standard)的规定与C程序相互调用与访问。9 `& K' R9 z% s) N; `5 X

# \5 s) M- \( f1 h. W/ \ATPCS,就是ARM、Thumb的过程调用标准,它规定了一些子程序间调用的基本规则。如寄存器的使用规则,堆栈的使用规则,参数的传递规则等。) T3 X) V% d5 B; v) h5 M8 x( G

6 _% M9 w8 s% [0 o/ I' }& ?在C程序和ARM的汇编程序之间相互调用必须遵守ATPCS。而使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS的规则。但是,对于汇编语言来说,完全要依赖用户保证各个子程序遵循ATPCS的规则。具体来说,汇编语言的子程序应满足下面3个条件:5 }- r4 {6 ?  j0 `9 n" R, ?! [7 ?4 O

+ R7 `5 u/ s6 C  W/ K' m$ P.  在子程序编写时,必须遵守相应的ATPCS规则;( }: a6 Z. c# n* Z3 ?1 k2 p- z
! ^+ o( ^% ]' [# q3 [& B% f
.  堆栈的使用要遵守相应的ATPCS规则;8 D0 L. P$ M$ ^/ B
0 q- \# E8 f! }; A
.  在汇编编译器中使用-atpcs选项。
' V* k2 v2 E- ^! L- k
8 }* @7 M; q2 O, m0 M( Y# O, K基本的ATPCS规定,详情请见相关PDF文档,简单说明就是:; `7 q9 |& ]* S* P6 D2 m
4 L) H7 |' X- ?, {0 N* R/ {: O
1. 汇编程序调用C程序
0 P4 n7 ?! T6 y% i8 N. s+ Z/ j
, t, F1 d$ L' {& {.  汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。# E7 ]* m- @* t) V

% W7 m9 K: {) X, O$ [.  在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数。" x4 C/ `$ l7 P% s2 z8 N) Y) |) n

4 M; K. I9 q, i$ k8 W  D" r.  在调用C程序时,要正确设置入口参数,然后使用BL调用。
, D1 b4 S* N* u5 X# P6 V* [2 b+ Q* B8 N; T0 [3 j- F
2. C程序调用汇编程序
: w: i! h; Y- t* b2 S, @
& i2 P6 X1 U, j  _# q  h.  汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。* Q$ u+ `/ C7 q% x5 a8 S* E
/ {$ ^* j+ g5 i# W* H- g6 X
.  在汇编程序中使用EXPORT伪指令声明本子程序,使其他程序可以调用此子程序。
0 w. E4 ^) ]  l( B& a8 u$ Q8 _
: k/ U) z( P+ }' u/ Z; `.  在C语言中使用extern关键字声明外部函数(声明要调用的汇编子程序)。9 g- ]1 M& }* v5 g4 Z5 g

. B7 U5 Y9 \; [1 }- `' e1 z: L在C语言的环境内开发应用程序,一般需要一个汇编的启动程序,从汇编的启动程序,跳到C语言下的主程序,然后,执行C程序,在C环境下读写硬件的寄存器,一般是通过宏调用,在每个项目文件的Startup2410/INC目录下都有一个2410addr.h的头文件,那里面定义了所有关于2410的硬件寄存器的宏,对宏读写,就能操作2410的硬件,具体的编程规则同标准C语言。
3 R9 c4 R  g/ E. N! q) [$ ?2 B8 f# D( ~, {& g+ {; b

, [7 }7 n4 b0 H0 n6 v# D3 h* p  o4 u: p! d; ]6 l
ARM Cortex™ 微控制器软件接口标准(CMSIS:CortexMicrocontroller Software InteRFace Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层。% P- }( m6 I% e" M; a! r  ?

: I4 j' j& i0 I/ S! |0 s, ?( a+ r$ h+ A" L7 W0 X8 h
( Q0 o4 s2 E5 H

+ |3 h  ?9 V+ j. }/ l9 l, a3 F$ O- @* i; `
基于CMSIS标准的软件架构主要分为以下4层:用户应用层、操作系统及# L! Y; O/ J7 Q$ ]' x* B* j# M
$ R5 h% Y! B+ ~4 e4 ]6 b
中间件接口层、CMSIS层、硬件寄存器层。其中CMSIS层起着承上启下的作用:一方面该层$ s  @2 d, \6 b7 X: F3 A

  V4 _& p  e  x; b7 e; u对硬件寄存器层进行统一实现,屏蔽了不同厂商对Cortex‐M系列微处理器核内外设寄存器/ A; C2 R4 T; C5 G9 F7 Y. i- b
! W+ J( {; Q7 t9 L/ r3 F
的不同定义;另一方面又向上层的操作系统及中间件接口层和应用层提供接口,简化了应用
! v5 B0 D4 z- u4 L4 A
+ T  t$ a# X0 a5 }: x3 p3 T程序开发难度,使开发人员能够在完全透明的情况下进行应用程序开发。也正是如此,CMSIS- o& _! Q/ [4 R
) v& e% \6 z: b' t
层的实现相对复杂。' K' \! L+ v, I; o5 j$ y, m  l- D

( V/ i! v2 W% C0 ~& i, W5 ^+ n2 j" L2 x

! n4 N8 q* N7 _* Dstm32f10x.h:CMSIS 的3 `5 F' \8 ], H

2 U. b5 c* T2 J' X1 [! g% ]Cortex‐M3 STM32f10xxx微
$ ^% {% l) d* r: l0 `. A
5 `6 ~' j  ~( n9 L1 c控制器外设访问层头文件7 P) F; w  s8 e; W* h8 Z! g3 M

* g8 I/ u$ `6 ^$ R0 g' d7 L1 Vsystem_stm32f10x.h :
4 R9 o1 N% G2 P3 H: o6 x* u. U! M1 V. n! o8 }
CMSIS 的 Cortex‐M3/ f) O( k6 w' t5 i
+ W. ?4 ?; R3 Z7 J
STM32f10xxx 微控制器外
$ M/ F5 u6 b& B% g) a) ^0 h
6 m, q, R9 E* S3 B设访问层头文件4 l5 n' A6 O2 H3 q

8 W' f+ k5 R: P. a& s; tsystem_stm32f10x.c :2 u" y$ v2 K" a) }

0 W/ h4 O! n1 b3 _6 wCMSIS 的 Cortex‐M3
) B2 g! Q; k4 [+ B, N' D) R4 Q- y, A8 j( p; L, r5 z# ?9 I5 k3 |+ E
STM32f10xxx 微控制器外) P2 ]7 L4 _9 c
4 s9 A$ b. [/ J: C/ c0 {
设访问层源文件
  t# n' [! n+ g$ Q/ h- E) Y8 a# O0 `; G

4 o1 E. |& c3 Z0 i8 }# `; J+ r9 R8 r8 t
首先新建一个项目并设置工具链对应的启动文件,可以使用标准外设库中提供的模板,也可7 D9 r. @- s0 ^- i0 ]+ x: X) ~
/ J7 ^$ g+ J9 b2 R8 C. \
以自己根据自己的需求新建。标准外设库中已经提供了不同工具链对应的文件,位于' g$ H- D7 c. Y0 m% v

; j( g( B$ w! U- B' J# L' k+ L7 b0 RSTM32F10x_StdPeriph_Lib_V3.4.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup& a& \! ]$ o, P9 c5 ?. y& ^3 A. ]
2 ^3 o8 X1 M$ t* `( x

2 i  X& V% r9 O0 _. m5 L% J+ r$ o9 x; n' g
目录下。7 c, D# Q( _2 G8 D5 y2 z2 p2 @

3 g; ?( |, L& {1 ^/ V7 i9 m3 P& o其次按照使用产品的具体型号选择具体的启动文件,加入工程。文件主要按照使用产品的容& p6 C; g8 |+ h6 G) s

$ x2 H3 z5 {  F量进行区分,根据产品容量进行选择即可。
- D# h6 K8 s2 y6 {
8 L$ b% P, x9 ?2 q; U) U! @5 J# Y6 ^& }" N4 M4 k& d

4 i- W- r# Y* ]' Q0 y/ y" p7 c0 x4 i5 }" M" t
4 @, o$ x% d/ X
stm32f4xx_it.h外设中断函数文件 用户可以相应的加入自己的中断程序的代码,对于指向同一个中断向量的多个不同中断请求,用户可以通过判断外设的中断标志位来确定准确的中断源,执行相应的中断服务函数
8 s" h. A! ]1 E+ i│  system_stm32f4xx.c  文件  函数Sysem_ExtMEMCtl,用来配置外部存储器控制器。它位于文件startup_stm32f10x_xx.s /.c,在跳转到main前调用 SystemFrequncy,该值代表系统时钟频率 * T! V6 Z1 d# g6 C
2 c3 C% u: Z5 \2 y) P" n
" ~: @* r9 i# D: K, e6 S
: g, `, ~4 q( N1 p& z2 _7 W
* Z$ i" }5 Z% U& Y) I, c
) P; F. J# s/ d  O) Z7 Y4 X' j: q
Libraries\STM32F10x_StdPeriph_Driver\下的内容很好理解就是stm32的各个& i$ ?) ]+ ^, \. D$ z3 b- P

: [( \/ q4 I+ a4 S: o  w4 J- u外设模块驱动代码。
( G7 y  y( N6 g# d4 F
, S$ I* G5 R* f) X! n misc.h和misc.c是和CM3内核有关的NVIC和SysTick的驱动代码。, h0 h- M  {2 V6 @

: W, ~8 S7 k" Q, c8 l. n Libraries\CMSIS下是什么呢?cmsis英文全称:CortexMicrocontroller; h9 ]5 ^+ i; b* ?( q* Y

' n/ G4 I7 {6 ~6 t) v5 x3 TSoftware Interface Standard,是Cortex系列处理器硬件抽象层,可以理解为cortex1 W- r! }7 _: r+ o
! D1 S' @# p6 q# z& Q
内核的软件接口。+ q$ V) E, |9 Y2 o8 g0 p# \

# w7 R+ {- [& A core_cm3.c, core_cm3.h
& D/ R3 \) L# p4 g& K7 T7 k& w$ c" I
3 {( Z  p; c. R* W2 ?% `7 r0 i  ~( ]  x它们的目录名为CoreSupport,说明这两个文件是CM3内核支撑文件,其他使# O# Q5 Z9 j( U" k! l# s  e  a
% Z4 ^0 z9 }# u0 P/ P* Q! C
用CM3内核的芯片也可以用,不一定是stm32。这两个文件用来获取设置CM3内! I8 N4 e9 _# t, A9 y% b& J* c, A
1 F5 \3 r$ S- o
核,配置一些内核寄存器。# h9 i$ G6 n6 B" e/ A3 n
- K2 \2 F2 c! x0 U" _( _4 R; t
stm32f10x.h, system_stm32f10x.c,system_stm32f10x.h和
; I$ F! @& s7 N+ E1 \+ @% o+ J
  ?6 ^# O1 C5 _( Kstartup_stm32f10x_hd.s在DeviceSupport目录下,说明这几个文件是和具体的芯* q: t& Z" r! \

; T/ O( \5 b, ?  j7 o$ V" m1 U片有关的,也就是stm32芯片的支撑文件。其中stm32f10x.h是标准外设库的入口,! x9 F8 q( m7 @+ C
* Z1 o0 ~/ u7 F
使用标准外设库的代码中必须包含该头文件。system_stm32f10x.c,' k$ g# v0 i8 M* k

/ u' u/ x1 U8 E; {8 m5 ^/ i( n; _$ Hsystem_stm32f10x.h这两个文件提供函数用来初始化stm32芯片,配置PLL、系$ V  O* p- y; H( F) u

8 C* y( Q5 i" A3 ~) P! ~统时钟和内置flash接口。startup_stm32f10x_hd.s是大容量型stm32芯片的启动& ^  k' b, I# r& z

6 ^) T, h/ L& L3 U, [5 r4 _6 |4 p文件) I! X0 d& p; [; {8 r; n" D
7 d' x' D) ]+ f! Y0 Q+ X2 _( x

* O4 `* k2 i# s4 \9 x7 V9 J: v# j! j$ N
stm32f10x_it.c,stm32f10x_it.h是中断服务程序文件。stm32f10x_conf.h是标
, E8 w8 ?9 g0 D1 k2 I) L: m+ u. X4 s6 l8 v
准外设库的配置文件,对于工程中不需要的外设,可以注释掉里面的包含的头文件。  f! u3 X' k& r: r' d1 G% Q7 T

+ i( V8 c* [& v" D* T5 U% W1 ~0 F这里我建议先仅留下stm32f10x_gpio.h,stm32f10x_rcc.h,misc.h,用到什么再打
. E3 C  Z( w, G$ y: G6 P' n
1 R" C) H- B  Z6 u: q开什么,这样编译起来快一点,当然也可都留着。; v5 I" c) g6 p" a6 y2 y3 @
" [7 D5 u2 ~# S' _

. Q' ~: S6 M1 z( @) S( ^
: _: e: w6 N7 J0 G3 X$ k" G! N- a

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-26 05:41 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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