AVR汇编(一):搭建交叉编译环境
AVR汇编(一):搭建交叉编译环境
几年间,陆陆续续接触了很多热门的单片机,如STC、STM8S、STM32、ESP32等。但一直都是抱着急功近利的心态去学习他们,基本上都是基于库函数和第三方组件进行开发,很少静下心来去研究这些不同内核单片机的底层工作原理。因此我打算接下来一段时间好好研究一番,先从相对容易的AVR内核开始。
AVR是Atmel推出的一个8位的RISC微控制器内核,哈佛架构,具备1MIPS/MHz的高速运行处理能力。本文将介绍在Linux系统下搭建AVR交叉编译环境,以及仿真AVR程序的方法,还会提到一些常用的GDB调试命令。
搭建AVR交叉编译环境
主要安装 avr-gcc 、 make 、 simavr 软件,前两者用于编译,后者用于仿真。
从Microchip官网下载GCC Compilers for AVR,选择“AVR 8-Bit Toolchain (Linux)”。

下载后得到 avr8-gnu-toolchain-3.7.0.1796-linux.any.x86_64.tar.gz 文件,将之解压到合适位置:
tar -zxvf avr8-gnu-toolchain-3.7.0.1796-linux.any.x86_64.tar.gz -C /path/to/avr-gcc
其中, -C 指定解压目录。
解压完成后,得到 avr8-gnu-toolchain-linux_x86_64 文件夹,avr-gcc 所有的编译工具、库、头文件等都存放在它下面,其中 bin 文件夹是 avr-gcc 等主要可执行文件的位置。

将 avg-gcc 所在的目录添加到 PATH 环境变量,然后重新加载终端:
echo -e "\nexport PATH=\$PATH:/path/to/avr-gcc/avr8-gnu-toolchain-linux_x86_64/bin" >> ~/.zshrc
source ~/.zshrc
检查 avr-gcc 是否安装成功,如果成功,则会正常输出版本信息:
avr-gcc --version

安装 make 和 simavr :
sudo apt update
sudo apt install make simavr
编译及仿真
首先准备一个用于仿真的源代码 hello.c ,内容如下:
#include <avr/io.h>
#include <stdint.h>
static void delay(void) {
for (volatile uint16_t i = 0; i < 0x8000; i++);
}
int main(void)
{
uint8_t mask = 1 << 5;
DDRB |= mask; // set PB5 to output mode
PORTB &= ~mask; // PB5 = 0
for (;;) {
PINB = mask; // toggle PB5
delay();
}
}
这段代码干的事情很简单,设置 PB5 为输出模式,然后不断翻转 PB5 的输出电平。
然后编写 Makefile 文件:
.PHONY: all clean
all: hello.elf
hello.o: hello.c
avr-gcc -mmcu=atmega328p -c -g -Wall -Og -std=gnu99 -o $@ $^
hello.elf: hello.o
avr-gcc -mmcu=atmega328p -o $@ $^
clean:
rm -rf *.o *.elf
文件定义的最终编译目标是 hello.elf ,其中不要忘了指定 avr-gcc 的 -mmcu 选项,这里 -mmcu=atmega328p 表示编译ATmega328P单片机的代码。
之后执行 make 进行编译,生成 hello.elf 文件。

接下来对 hello.elf 进行仿真,这主要借助 simavr 和 avr-gdb 来实现。
simavr -f 16000000 -m atmega328p --gdb hello.elf
这条命令中 -f 设置仿真频率, -m 指定仿真的单片机型号,可以通过 simavr --list-cores 查看所有支持的单片机型号, --gdb 开启GDB服务,监听端口为 1234 。
再打开另一个终端窗口,用于执行 avr-gdb 。
avr-gdb -ex "target remote localhost:1234" -q --tui hello.elf
执行这条命令后,将进入 avr-gdb 调试界面。

常用GDB命令
| 命令 | 功能 | 示例 |
|---|---|---|
help |
查看帮助 | help all 查看所有命令help print 查看 print 命令的帮助信息 |
target remote |
连接到远程GDB服务器 | target remote localhost:1234 连接到本地端口号为 1234 的GDB服务器 |
layout |
设置窗口布局 | layout regs 显示寄存器窗口layout src 显示源码窗口layout split 显示源码和反汇编窗口 |
break |
设置断点 | break n 在第 n 行设置断点break func 在 func 函数入口处设置断点 |
print |
打印表达式的值 | print/x var 以十六进制形式打印变量 var 的值 |
display |
在程序每次暂停时打印表达式的值 | display/x $r24 以十六进制形式在每次程序暂停时打印 r24 寄存器的值 |
info registers |
显示寄存器的内容 | info registers r24 显示 r24 寄存器的内容 |
continue |
继续运行 | |
next |
单步调试(不进入函数) | next n 执行 n 步 |
step |
单步调试(进入函数) | step n 执行 n 步 |
backtrace |
显示当前堆栈 | |
list |
查看源码 | list n 显示第 n 行前后10行代码list func 显示 func 函数的源代码 |
quit |
退出GDB |
参考资料
AVR汇编(一):搭建交叉编译环境的更多相关文章
- Linux 14.04lts 环境下搭建交叉编译环境arm-linux-gcc-4.5.1
交叉编译工具链是为了编译.链接.处理和调试跨平台体系结构的程序代码,在该环境下编译出嵌入式Linux系统所需要的操作系统.应用程序等,然后再上传到目标板上. 首 先要明确gcc 和arm-linux- ...
- Linux系统移植(1) ------搭建交叉编译环境
本人的开发环境是ubuntu12.05的64版本,运行在11.00的虚拟机上.首先说明为什么需要搭建交叉编译环境.我们知道,我们的开发一般在PC机上,是基于X86架构的,而我们的开发板却是基于ARM架 ...
- 嵌入式开发(一) Ubuntu12.04下搭建交叉编译环境
操作系统:Ubuntu12.04 AMD64位 交叉编译环境:arm-Linux gcc版本4.4.3 前言: 首先理解一下交叉编译的意思.我们要给嵌入式设备写应用程序,但是又不能在嵌入式设备上完成所 ...
- zedboard搭建交叉编译环境
参考:http://blog.csdn.net/xzyiverson/article/details/11264417 我安装的LINUX12.04LTS 双系统 下载好交叉编译软件xilinx-20 ...
- 在ubuntu上搭建交叉编译环境---arm-none-eabi-gcc
最近要开始搞新项目,基于arm的高通方案的项目. 那么,如何在ubuntu上搭建这个编译环境呢? 1.找到相关的安装包:http://download.csdn.net/download/storea ...
- crosstool-ng搭建交叉编译环境注意事项
一,crosstool-ng的下载及编译方法 可以参考如下网站: http://www.crosstool-ng.org/ 二,编译过程注意事项 1)如果遇到有些代码包不能下载,请依据指定版本,在这里 ...
- ubuntu搭建交叉编译环境makeinfo: command not found
解决办法:sudo apt-get install texinfo
- Ubuntu12.04嵌入式交叉编译环境arm-linu-gcc搭建过程,图解
转载:王文松的博客Ubuntu12.04嵌入式交叉编译环境arm-linu-gcc搭建过程,图解 安装环境 Linux版本:Ubuntu 12.04 内核版本:Linux 3.5.0 ...
- Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程
Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程Linux版本:Ubuntu 12.04 内核版本:Linux 3.5.0 交叉编译器版本:arm-linux-gcc-4. ...
- Ubuntu 上 hi3531 交叉编译环境 arm-hisiv100nptl-linux 搭建过程
安装SDK 1.Hi3531 SDK包位置 在"Hi3531_V100R001***/01.software/board"目录下,您可以看到一个 Hi3531_SDK_Vx ...
随机推荐
- 2021-05-19:给定一个非负数组成的数组,长度一定大于1,想知道数组中哪两个数&的结果最大。返回这个最大结果。时间复杂度O(N),额外空间复杂度O(1)。
2021-05-19:给定一个非负数组成的数组,长度一定大于1,想知道数组中哪两个数&的结果最大.返回这个最大结果.时间复杂度O(N),额外空间复杂度O(1). 福大大 答案2021-05-1 ...
- Linux:论如何在虚拟机上挂载多个镜像?
欢迎来到千汐 博客名称:千秋云染博客网址:https://www.cnblogs.com/skyrainmom 寄语:在混乱不堪的世界里你只管前行,时间替会证明一切 world cookie 我可 ...
- 【CF】掉分总结
比赛总结 前情提要 自从前段时间连续掉分,就心态崩了,还是自己太菜,一直想写个总结,看看这几场比赛都干了啥,以后准备怎么办.鸽了这么久的总结,是该写写了. 这是正文 首先大致提一下情感曲线(菜的真实) ...
- Hackathon 代码黑客马拉松采访复盘
AIGC Hackathon 2023 北京站 我参加了选手采访提纲,这里我感觉有些点可以分享给大家.之前复盘的链接: 下面是采访我的回答内容: 1. 请向大家简单介绍一下自己吧? 子木,社区名称为程 ...
- 生信入门必须掌握的 30 个 Linux 命令
学习生物信息,Linux 是必须掌握的内容,其实常用的 Linux 命令也就 30 个左右,而且这些命令都是单词的简写,记忆起来并不困难.这里列出了常用的 30 个命令. 1. cd Change d ...
- CentOs7安装部署Sonar环境(JDK1.8+MySql5.7+sonarqube7.8)
sonarqube安装前环境准备JDK1.8.MySql5.7. 一.JDK安装 1.下载jdk #打开下面的网址,选择 jdk-8u371-linux-x64.tar.gz 进行下载 (8u371版 ...
- Java:错误:不支持发行版本5
#解决方案1 1.点击File--Project Structure 2.点击Project 3.查看jdk版本是否和安装的一样 4.点击Modules 查看版本 5.点击Preferences--B ...
- 数据挖掘18大算法实现以及其他相关经典DM算法:决策分类,聚类,链接挖掘,关联挖掘,模式挖掘。图算法,搜索算法等
数据挖掘18大算法实现以及其他相关经典DM算法:决策分类,聚类,链接挖掘,关联挖掘,模式挖掘.图算法,搜索算法等 算法码源见文末 1.算法目录 18大DM算法 包名 目录名 算法名 Associati ...
- python中的数据容器
第六章:Python数据容器 数据容器入门 什么是数据容器 一种可以容纳多份数据的数据类型,容纳的每一份数据称之为1个元素,每一个元素,可以是任意类型的数据,如字符串.数字.布尔等. 根据特点的不同分 ...
- 【Docker】离线安装
离线安装Docker 1.下载docker 离线安装包 下载地址如下:Index of linux/static/stable/x86_64/ 2.将下载的包上传至服务器上 我这里下载的是20.1 ...