Arm入门第二讲,配置Arm环境
Arm入门第二讲,配置Arm环境
一丶简介
关于市面上Arm的环境应该有好多. 在之前记得又看到过gcc也可以配置. 不过我这里用的是Keil uVision5 程序
这里给出官方下载链接: Keil uVision5 不过鉴于这个程序下载慢配置不稳定.这里我就提供个百度盘链接.
链接:https://pan.baidu.com/s/1Kc-6Bw4v5Y7u2JvUHDtxvw
提取码:5765
二丶工具配置
工具下载之后一Next(继续)下去即可. 跟正常软件安装一样. 不懂上网搜.这里不截图
2.1 工程的建立
当安装之后首先要创建一个功能. 点击Project->New uVision Project 则会出现一个弹出窗口.
我们只需要在下面文件名一览输入你自定义的名字即可. 他则会创建一个工程到这个文件夹下. 点击 保存之后
则需要你选择 设备 如下图 我们选择ARMCM0即可:
点击OK按钮 之后这里就会弹出 Run-Time 环境设置 如下图
这里把上面的选择都勾上即可.下面就说明字段的意思
CMSIS 这个选项是ARM与其它厂商定义的一个公共的接口
Device 设备的意思. 是arm运行需要的
OK之后界面如下
CMSIS Device都是我们在创建的时候选择的. 这里的工程名是我们创建的时候起的名字. 然后在Source Group 1
上面右键选择 Add New Item to Group 'Source Group 1' ... 打开之后就能看到可以创建好多文件.包括C C++的源文件.
为了学习这里选择创建C 源文件 后缀名为.c结尾. 创建之后我们的 Source Group1里面就有我们的C源文件了
我们就可以在里面写 标准的C源代码了 如下:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("HelloWorld");
return 0;
}
2.2 程序的编译(Build) 与调试配置
-
1.程序的编译
程序编译很简单. 只需要 按快捷键 F7 或者在 hellword.c 位置右键 选择build即可
-
2.程序的调试配置
配置调试 我们首先要打开配置界面. 这里有三种方式
1 快捷键 Alt+F7
2.直接在界面中选择
3.在菜单栏 项目(Protect中选择)
下面两种看下图:
打开后界面如下 保持选择跟红色框一致即可:
此时我们就支持调试. F9可以代码前面设置断点. F10 F11分别就是步过和进入的意思. 启动调试可以在菜单栏中的Debug选项中设置. 调试跟其它IDE一样都是有得. 只需要熟悉下即可.
设置之后就可以看到IDE应有的调试功能了. 包含堆栈 内存 寄存器等
2.3 程序入口与系统入口的了解
我们的程序如下:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("HelloWorld");
return 0;
}
那么有过C开发知识的人应该知道, main 函数就是入口点. 对这是没错的. 它就是我们程序的入口点
而如果用VC++开发过C程序的人应该知道. main也是由其它封装好的函数调用的. 也就是 _mainstartup 好像是这个名字.
在我们这个程序中,也有类似与 _mainStartup 入口. 也就是我们所说的程序入口.
他就在 Device下的->Startup_ARMCM0.s中.
如下图:
这个简单了解下即可.
三丶编写最简单的Asm
这个项目不光可以建立C文件 也可以建立汇编 Asm文件. 只需要按照配置的时候建立C文件 改为建立ASM文件即可.
建立好 asm文件之后填写下列代码
Version EQU 0 ;set version number 这里设置版本好. 而且和x86汇编一样 分号(;)代表注释
area IBinary_Armtest,code,readonly ;这里设置 代码 名字 以及属性值 是只读还是其他. 其中名字可以随便改
entry ;定义我们的入口点
export main ;main 比如与上面我们所讲的系统入口点调用的入口一致,这里就是main
main ;函数的名字
start ;函数开头
mov R0,#0x4
mov R1,#0x8 ;这里的汇编与x86一样, r0赋值为4 r1赋值为8
add R0,R0,R1;add r0 r0,r1意思就是最后的r0 r1相加. 结果放到最前面的r0中. 与x86也类似
stop
b stop
end ;结束
如果你拷贝这个代码到编译器中,并且编译是不会成功的. 原因在于
mov R0,#0x4
mov R1,#0x8
改为:
movs R0,#0x4
movs R1,#0x8
原因在于这里的mov指令没问题. 可是这种指令必须在后面加上影响标志相关的属性. 这里跟x86不一样. 大体意思就是
你操作完一个指令之后你要告诉我是进位了 是溢出了 还是其它咋地了. 关于标志为在上一节简介过. 这里只需要知道加上s即可.
后面会完整的学习指令.