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

ARM学习笔记

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
ARM程序的开发中,需要大量读写硬件寄存器,尽量缩短程序的执行时间,因此部分初始化代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。
( ]' m& w) T) q5 z$ L* H! ^; {1 T9 m9 k$ m/ _9 b; u: z. t
C语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。
/ p8 ^0 l  x. v$ U, N/ L7 i
6 @1 @( M' b# q- y, T9 QARM使用C语言编程基本规则. D8 X6 l- X8 F4 z  \7 B' D
5 w& Q' C+ E/ f' w7 G9 h
在应用系统的程序设计中,若所有的编程任务均由汇编语言来完成,其工作量巨大,并且不易移植。由于ARM的程序执行速度较高,存储器的存储速度和存储量也很高,因此,C语言的特点充分发挥,使得应用程序的开发时间大为缩短,代码的移植十分方便,程序的重复使用率提高,程序架构清晰易懂,管理较为容易等等。因此,C语言的在ARM编程中具有重要地位。+ g! S5 M; `# }1 q

# x% s0 y: @7 a) L6 l在ARM程序的开发中,需要大量读写硬件寄存器,尽量缩短程序的执行时间,因此部分初始化代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。- ]2 n2 E+ f7 X5 w" V
  n& b' {9 S+ l4 @
C语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。1 g% e; G, J8 K! }

3 [8 G# Y3 D5 W在使用C语言时,有时要用到和汇编语言的混合编程。当汇编代码较为简洁,则可使用直接内嵌汇编的方法,否则,将汇编程序以文件的形式加入项目当中,通过ATPCS(ARM/Thumb Procedure Call Standard)的规定与C程序相互调用与访问。
5 c/ w" u( Q  e# x# d$ |
5 r. Z# s3 p% MATPCS,就是ARM、Thumb的过程调用标准,它规定了一些子程序间调用的基本规则。如寄存器的使用规则,堆栈的使用规则,参数的传递规则等。
1 v5 ^8 g% Y" h" {( Z1 I& [7 K) o! K" P  @& u% g
在C程序和ARM的汇编程序之间相互调用必须遵守ATPCS。而使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS的规则。但是,对于汇编语言来说,完全要依赖用户保证各个子程序遵循ATPCS的规则。具体来说,汇编语言的子程序应满足下面3个条件:
5 b' \- ?. J0 x) B% b+ b7 k6 D+ G2 f; b: D$ R. X4 q* I
.  在子程序编写时,必须遵守相应的ATPCS规则;
: t0 i. |! O" z; g4 N2 |! J5 _+ ?' ]; H- W2 M7 I
.  堆栈的使用要遵守相应的ATPCS规则;0 [- [3 B  `2 t" c2 B4 Q

1 M3 X' x/ T% F9 q- b.  在汇编编译器中使用-atpcs选项。+ \" a6 _* N7 B, e8 b1 n

( Z8 I: p$ x/ u, a* Y基本的ATPCS规定,详情请见相关PDF文档,简单说明就是:9 H* X9 O, v6 p: N! S, J- L- z

) s( p6 A: D6 }+ [( s7 m& H1. 汇编程序调用C程序
8 m0 O7 a- ?4 p" R9 l) d2 X6 K9 G: p  @9 p8 @% {
.  汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。
6 P) ]( i* {6 T0 w6 b+ ]$ m8 Y6 ?2 P8 [, s& T9 `
.  在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数。6 ~$ f6 E0 |: ?; H4 [  C  B

9 B, Y2 {$ C0 B6 F: N.  在调用C程序时,要正确设置入口参数,然后使用BL调用。% N+ r4 c$ B" n0 s+ i

0 }+ j3 f$ i3 i% H5 f5 {, o2. C程序调用汇编程序/ N5 j  \) ~  i# m0 T4 ?3 ?

$ [9 Y1 e! j) `, \0 F.  汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。* E' H9 j; q7 s& I! e

1 Q: l5 s2 {! s3 R.  在汇编程序中使用EXPORT伪指令声明本子程序,使其他程序可以调用此子程序。) L* p9 i# @- t0 E8 g

+ M! @# e. K6 p% B+ [8 u.  在C语言中使用extern关键字声明外部函数(声明要调用的汇编子程序)。
% d* }) Y' w9 P" R' C, J7 H% Z( A0 o" `4 b2 f2 O, V
在C语言的环境内开发应用程序,一般需要一个汇编的启动程序,从汇编的启动程序,跳到C语言下的主程序,然后,执行C程序,在C环境下读写硬件的寄存器,一般是通过宏调用,在每个项目文件的Startup2410/INC目录下都有一个2410addr.h的头文件,那里面定义了所有关于2410的硬件寄存器的宏,对宏读写,就能操作2410的硬件,具体的编程规则同标准C语言。
0 ~6 V& U' ?1 h) p  r3 R* s3 j6 I6 B! J4 a  ?+ G
9 j/ ^# L; _6 I9 o
0 T9 r  g! n$ t  P0 J' o9 {( Q
ARM Cortex™ 微控制器软件接口标准(CMSIS:CortexMicrocontroller Software InteRFace Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层。7 V4 ~2 g) T" V; b) q8 g4 m0 j" Q

7 P  u) a& A! e8 E- B, m( N" A* C3 t6 o% b# l) Y3 K3 ?. u
0 A* K3 b$ p7 N

" p& b5 d) Z0 G, A+ `* @5 M
5 X2 c0 T: l% e8 [$ F. L3 V基于CMSIS标准的软件架构主要分为以下4层:用户应用层、操作系统及
( `- Z6 O4 i9 S9 x3 e& b  N, `/ t+ i" o2 [. P
中间件接口层、CMSIS层、硬件寄存器层。其中CMSIS层起着承上启下的作用:一方面该层1 T- H& j9 S! R: v8 S

$ G/ ~) Y2 l* N9 W) \7 Y, `8 q3 G对硬件寄存器层进行统一实现,屏蔽了不同厂商对Cortex‐M系列微处理器核内外设寄存器: O. G# J& l2 z$ R( U, j

4 j& t) d' s/ }5 d的不同定义;另一方面又向上层的操作系统及中间件接口层和应用层提供接口,简化了应用
9 u4 p6 l4 D# P
* x; F( r& @4 a& z程序开发难度,使开发人员能够在完全透明的情况下进行应用程序开发。也正是如此,CMSIS
/ q& x' K. H: @$ u1 _3 b1 s: z. ^5 W# K' A3 Z! P0 p* A- D5 B2 H
层的实现相对复杂。
* ~" I3 {* j) A4 |% |& A. u) P, B! @0 V( C7 |# z$ D. d; M
0 p  m/ u2 B# G: a: K# K/ n

. Y9 N5 Q4 P1 N% e0 I; Xstm32f10x.h:CMSIS 的# @8 p" F5 E% e! U: D6 ?
. @4 T: t$ g) h. q2 V* `: z' O
Cortex‐M3 STM32f10xxx微
7 `) l- y* d- }- c) K# e( n8 m5 T) B# z! m% ^, o7 q* D0 C
控制器外设访问层头文件
" ]* X% `/ n* r8 O( B' r, z- [8 [! J' i0 S' p
system_stm32f10x.h :
6 ^( K/ w; [5 \8 x# h* Z
7 j0 w$ U, a; G8 o1 H5 aCMSIS 的 Cortex‐M3  j6 t" B6 Y2 r) [$ O( R7 Y) {
& w7 p" Y- t- a8 ]: c: \) Z  _
STM32f10xxx 微控制器外
  H# i8 Q; u3 H! R7 d! _$ D
! U0 I* @1 h/ M) k+ L设访问层头文件
4 z) h: O* Q) S3 x- f: p
3 Z8 }7 j" v) Q# i" asystem_stm32f10x.c :/ r6 o: j: C( I+ L" [0 Y

& @# {4 q2 k: Q7 Z$ N6 GCMSIS 的 Cortex‐M32 e1 m. Y& f. S- L" V, r& V
( n5 u: z4 n( i, T( V6 `
STM32f10xxx 微控制器外
, I# A6 O5 C( S4 v, M' t! p
; U- R8 |8 c9 o! \& c设访问层源文件
; ^$ k. O5 c6 F5 K1 G" n" z# l3 Q3 J" {1 S9 f! N& b

6 P" x# q5 t" S( `+ G
  E& x: U% c; |0 g首先新建一个项目并设置工具链对应的启动文件,可以使用标准外设库中提供的模板,也可
9 Y' X8 z; t0 m) f0 n
8 Q- s4 Y  @7 Y8 G9 M8 n6 w/ j& d以自己根据自己的需求新建。标准外设库中已经提供了不同工具链对应的文件,位于
) P3 T* X% C0 r  m: ]1 t
. u- e# V) G8 ~/ E! [STM32F10x_StdPeriph_Lib_V3.4.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup# |  z# i. \* L4 a! Z- g+ s6 i0 D
* [9 q% h- i0 O
1 ?9 r! z5 r& v& v

. x' U, q) M6 a$ n目录下。
- y; Y# Y% O: o: v% t, G7 B  u/ E' f9 t5 W) m5 M; a. @. A5 R
其次按照使用产品的具体型号选择具体的启动文件,加入工程。文件主要按照使用产品的容
5 Z0 S7 _4 `8 |5 U
% ]! V3 _: A- W7 s# h& O量进行区分,根据产品容量进行选择即可。' I: d, R% V; i. o/ k5 V

9 \2 v8 U: z* @
% v) Z; i/ H$ x$ m, V5 y3 F- |1 I) i1 O& t
% W" L4 E9 K+ z) K
( L/ B* E) h8 H
stm32f4xx_it.h外设中断函数文件 用户可以相应的加入自己的中断程序的代码,对于指向同一个中断向量的多个不同中断请求,用户可以通过判断外设的中断标志位来确定准确的中断源,执行相应的中断服务函数; |0 c) k( L% K! R* m
│  system_stm32f4xx.c  文件  函数Sysem_ExtMEMCtl,用来配置外部存储器控制器。它位于文件startup_stm32f10x_xx.s /.c,在跳转到main前调用 SystemFrequncy,该值代表系统时钟频率
: G0 F# N+ ]; M  H  _
* }' Z" {: r; E6 {2 q$ q, B2 K& z
5 b) U9 A# q8 ^5 z) U) H3 c+ c1 b4 _* }. `/ N8 x# P8 r
4 c0 b# X2 c( M: [/ |0 X
: X- a5 E8 i. S9 g6 v
Libraries\STM32F10x_StdPeriph_Driver\下的内容很好理解就是stm32的各个
  b! P' ^4 I6 b/ E0 |$ B) k9 e& o$ T
外设模块驱动代码。: U" A6 k7 @, @2 s2 X& h# _
" @, R' F1 w3 y7 x
misc.h和misc.c是和CM3内核有关的NVIC和SysTick的驱动代码。
2 x- x4 n3 m5 }/ r/ ?: L+ X
5 J  g) K* c& w8 m3 C6 H! Q Libraries\CMSIS下是什么呢?cmsis英文全称:CortexMicrocontroller
: ~2 }; n2 M' _2 H# a# R% S) f9 E" Z) e+ l! M
Software Interface Standard,是Cortex系列处理器硬件抽象层,可以理解为cortex
) C, r3 Z# Q* t; J: x
2 D/ h( T# Y8 E: E内核的软件接口。8 w8 ]4 f* a$ ]; k+ A

2 j- O, D* x; }2 T8 n9 p3 H core_cm3.c, core_cm3.h. Q# j& j% e8 F9 y. d4 X9 z: A( I: [

. {* e  C$ o* L它们的目录名为CoreSupport,说明这两个文件是CM3内核支撑文件,其他使
4 P$ {* L$ K+ ?) W2 N$ g$ Q1 |- i) ?" `
用CM3内核的芯片也可以用,不一定是stm32。这两个文件用来获取设置CM3内3 l+ U6 m% v+ k9 X3 y- d. V

9 V' p2 V$ u, ?2 y$ o- }& k) q核,配置一些内核寄存器。
1 N1 B0 }2 V' g& B  |
5 E/ P" I! Y" Qstm32f10x.h, system_stm32f10x.c,system_stm32f10x.h和
& ^* y- @4 x7 W+ W* G7 Q: E( K. t* m% y
startup_stm32f10x_hd.s在DeviceSupport目录下,说明这几个文件是和具体的芯
+ w0 [! M7 Q4 V
; Z% H& W6 k; z6 K% v片有关的,也就是stm32芯片的支撑文件。其中stm32f10x.h是标准外设库的入口,
2 s4 ^, j6 D( r0 O! _, N; T+ Q+ C& A% d* l# [1 o1 b/ [( \
使用标准外设库的代码中必须包含该头文件。system_stm32f10x.c,
) t7 G; i+ ]+ X
: E, f% _0 u- i) o2 ^, S7 E# msystem_stm32f10x.h这两个文件提供函数用来初始化stm32芯片,配置PLL、系
- L; ]( t" X: W3 S: ^- U. e: Z0 S5 ~
统时钟和内置flash接口。startup_stm32f10x_hd.s是大容量型stm32芯片的启动3 J1 G9 o7 O) o" g2 o$ v

/ @+ [5 a( z1 S1 [9 o, c文件  H* T0 Q4 X, d& d, n* d
; S) l" W5 J9 O6 p! Y$ V& w

8 ]1 j, q2 W% s. `1 m  ~
5 j3 {# F6 x0 S0 d4 i  O) pstm32f10x_it.c,stm32f10x_it.h是中断服务程序文件。stm32f10x_conf.h是标0 A! ?) F1 u. w' q) Q) G
% m3 f. q5 i& K* W
准外设库的配置文件,对于工程中不需要的外设,可以注释掉里面的包含的头文件。
$ W3 P; o& F( N# s! J. T; k1 Q! l4 n) @* Z! `' L
这里我建议先仅留下stm32f10x_gpio.h,stm32f10x_rcc.h,misc.h,用到什么再打
7 u: i2 w* E! Z( S' Q3 K7 A% b3 f( p
. F2 b7 c' b7 q0 s$ `8 c( u6 E开什么,这样编译起来快一点,当然也可都留着。
' d* ?# ^  \3 X' J8 h5 O7 X: Q, b) h7 w

" z* F7 t/ M, E, p$ c  r
0 r; {1 L  M7 S7 S- K1 V- P6 {" h

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-25 23:04 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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