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

参考资料

  1. GCC Compilers for AVR
  2. buserror/simavr
  3. GDB常用命令
  4. GDB User Manual

AVR汇编(一):搭建交叉编译环境的更多相关文章

  1. Linux 14.04lts 环境下搭建交叉编译环境arm-linux-gcc-4.5.1

    交叉编译工具链是为了编译.链接.处理和调试跨平台体系结构的程序代码,在该环境下编译出嵌入式Linux系统所需要的操作系统.应用程序等,然后再上传到目标板上. 首 先要明确gcc 和arm-linux- ...

  2. Linux系统移植(1) ------搭建交叉编译环境

    本人的开发环境是ubuntu12.05的64版本,运行在11.00的虚拟机上.首先说明为什么需要搭建交叉编译环境.我们知道,我们的开发一般在PC机上,是基于X86架构的,而我们的开发板却是基于ARM架 ...

  3. 嵌入式开发(一) Ubuntu12.04下搭建交叉编译环境

    操作系统:Ubuntu12.04 AMD64位 交叉编译环境:arm-Linux gcc版本4.4.3 前言: 首先理解一下交叉编译的意思.我们要给嵌入式设备写应用程序,但是又不能在嵌入式设备上完成所 ...

  4. zedboard搭建交叉编译环境

    参考:http://blog.csdn.net/xzyiverson/article/details/11264417 我安装的LINUX12.04LTS 双系统 下载好交叉编译软件xilinx-20 ...

  5. 在ubuntu上搭建交叉编译环境---arm-none-eabi-gcc

    最近要开始搞新项目,基于arm的高通方案的项目. 那么,如何在ubuntu上搭建这个编译环境呢? 1.找到相关的安装包:http://download.csdn.net/download/storea ...

  6. crosstool-ng搭建交叉编译环境注意事项

    一,crosstool-ng的下载及编译方法 可以参考如下网站: http://www.crosstool-ng.org/ 二,编译过程注意事项 1)如果遇到有些代码包不能下载,请依据指定版本,在这里 ...

  7. ubuntu搭建交叉编译环境makeinfo: command not found

    解决办法:sudo apt-get install texinfo

  8. Ubuntu12.04嵌入式交叉编译环境arm-linu-gcc搭建过程,图解

    转载:王文松的博客Ubuntu12.04嵌入式交叉编译环境arm-linu-gcc搭建过程,图解 安装环境       Linux版本:Ubuntu 12.04    内核版本:Linux 3.5.0 ...

  9. Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程

    Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程Linux版本:Ubuntu 12.04 内核版本:Linux 3.5.0 交叉编译器版本:arm-linux-gcc-4. ...

  10. Ubuntu 上 hi3531 交叉编译环境 arm-hisiv100nptl-linux 搭建过程

    安装SDK 1.Hi3531 SDK包位置     在"Hi3531_V100R001***/01.software/board"目录下,您可以看到一个 Hi3531_SDK_Vx ...

随机推荐

  1. SVN添加新的用户

    1.首先确定svn的文件夹的位置 find / -name svn 2.通过find找到svn地址之后,cd进入 /var/svn/ 下 cd /var/svn/ 3.修改/var/svn/下面的au ...

  2. docker(一):Develop faster. Run anywhere.

    前言 在进行微服务部署时,首先需要进行部署环境的搭建.目前,Docker 已经成为了微服务部署的主流解决方案之一.Docker 可以帮助我们更快地打包.测试以及部署应用程序,从而缩短从编写到部署运行代 ...

  3. 飞桨Paddle动转静@to_static技术设计

    一.整体概要 在深度学习模型构建上,飞桨框架支持动态图编程和静态图编程两种方式,其代码编写和执行方式均存在差异: 动态图编程: 采用 Python 的编程风格,解析式地执行每一行网络代码,并同时返回计 ...

  4. 2022-07-21:给定一个字符串str,和一个正数k, 你可以随意的划分str成多个子串, 目的是找到在某一种划分方案中,有尽可能多的回文子串,长度>=k,并且没有重合。 返回有几个回文子串。 来

    2022-07-21:给定一个字符串str,和一个正数k, 你可以随意的划分str成多个子串, 目的是找到在某一种划分方案中,有尽可能多的回文子串,长度>=k,并且没有重合. 返回有几个回文子串 ...

  5. 2022-05-18:假设数组a和数组b为两组信号: 1) length(b) <= length(a); 2) 对于任意0<=i<length(b), 有b[i+1] - b[i] == a[i+1

    2022-05-18:假设数组a和数组b为两组信号: length(b) <= length(a): 对于任意0<=i<length(b), 有b[i+1] - b[i] == a[ ...

  6. Django-Virtualenv虚拟环境安装、新建,激活和手动指定Python解释器、虚拟环境安装Django、创建Django项目、运行Django项目

    一.安装虚拟环境: 命令:pip3 install virtualenv 二.安装管理工具: 命令:pip3 install virtualenvwrapper 三.新建: 命令:python -m ...

  7. 开发者一定要知道的 API 管理五大趋势

    API First 大势所趋,APIaaS(API 作为服务)也将受到越来越多企业和组织的选择,研发团队对 API 研发管理工具的要求也水涨船高. API 在今天的数字化世界中扮演着至关重要的角色,随 ...

  8. # 代码随想录算法训练营Day10 栈与队列| 理论基础  232.用栈实现队列  225. 用队列实现栈

    栈与队列理论基础 队列是先进先出,栈是先进后出 关于栈的四个问题 C++中stack 是容器么? 我们使用的stack是属于哪个版本的STL? 我们使用的STL中stack是如何实现的? stack ...

  9. SQL注入三连实战绕过WTS-WAF

    一键三连,sql注入 一次无意之间发现的sql注入,主要是因为有一个WTS-WAF,在此记录一下 只是友好测试,并非有意为之.... 牛刀小试1 手注 判断字段数 测试到order by 15的时候出 ...

  10. Road

    首先进行端口扫描22 80 使用nmap进行vuln nmap -sS --script=vuln 10.10.236.244 10.10.236.244/v2/admin/login.html 随便 ...