首页 > 编程语言 >AVR汇编(一):搭建交叉编译环境

AVR汇编(一):搭建交叉编译环境

时间:2023-08-09 13:46:31浏览次数:55  
标签:汇编 gcc avr 编译 GDB AVR hello

AVR汇编(一):搭建交叉编译环境

几年间,陆陆续续接触了很多热门的单片机,如STC、STM8S、STM32、ESP32等。但一直都是抱着急功近利的心态去学习他们,基本上都是基于库函数和第三方组件进行开发,很少静下心来去研究这些不同内核单片机的底层工作原理。因此我打算接下来一段时间好好研究一番,先从相对容易的AVR内核开始。

AVR是Atmel推出的一个8位的RISC微控制器内核,哈佛架构,具备1MIPS/MHz的高速运行处理能力。本文将介绍在Linux系统下搭建AVR交叉编译环境,以及仿真AVR程序的方法,还会提到一些常用的GDB调试命令。

搭建AVR交叉编译环境

主要安装 avr-gccmakesimavr 软件,前两者用于编译,后者用于仿真。

从Microchip官网下载GCC Compilers for AVR,选择“AVR 8-Bit Toolchain (Linux)”。

image.png

下载后得到 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 等主要可执行文件的位置。

image.png

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

image.png

安装 makesimavr

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 文件。

image.png

接下来对 hello.elf 进行仿真,这主要借助 simavravr-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 调试界面。

image.png

常用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 funcfunc 函数入口处设置断点
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

标签:汇编,gcc,avr,编译,GDB,AVR,hello
From: https://www.cnblogs.com/chinjinyu/p/17616634.html

相关文章

  • vs2017 启用自带 反编译功能
    打开此功能后,我们就可以查看dll文件源码了vs2017需要手动打开设置-选项vs2022已经默认打开了,不需要我们单独设置 ......
  • rocky linux:编译安装python3.11.4(rocky linux 9.2)
    一,查看现有的版本:1,本地版本[root@img~]#python--versionPython3.9.162,现在的最新版本:访问官网:https://www.python.org/如图:可以看到线上的最新版本是3.11.4 二,编译/安装:1,下载:先复制下载地址2,从服务器用wget命令下载:[root@imgpython]#wgethttp......
  • sick_scan_xd(西克雷达ros驱动编译)v2.91
    1.写在前面sick有多款的单线激光雷达以及多线雷达目前在低速的导航方向以及工业检测方便均有应用,ros系统是目前应用广泛的机器系统,因此sick也提供了多款雷达的rosdriver,通过了解该驱动可以解决开发时间。2.在window无ros环境编译准备vs2019社区版本或者专业板环境通过Develo......
  • 【C++第三方库】Windows下编译和使用websocketpp
    应用场景:使用C++开发一个支持websocket协议的服务进程,可与HTML5(浏览器js文件)通信。来实现替换基于firebreath框架的跨浏览器插件开发。当前,讲述websocketpp开源库的应用。目的是为了实现C++进程,支持websocket协议。但WebSocketpp是一个开源库,依赖于Boost和OpenSSL资源准......
  • 【我和openGauss的故事】openEuler20.03上编译安装opengauss-5.0.0
    【我和openGauss的故事】openEuler20.03上编译安装opengauss-5.0.0ziyoo0830[openGauss](javascript:void(0);)2023-08-0316:49发表于四川为了更好地学习openGauss数据库知识,有时候需要去调试源代码来深入了解一些东西。以下记录了在openEuler20.03上编译最新的openGauss-serve......
  • 汇编-xor异或
     XOR指令在两个操作数的对应位之间进行(按位)逻辑异或(XOR)操作如果两个位值相同(同为0或同为1),则结果位等于0;否则结果位等于1【相同为0,不同为1】      ......
  • 【GCC】在Windows下使用GCC编译程序
    1、安装到MinGW下载最新的安装包2、使用将安装包下载解压后,直接使用gcc进行编译:#include"stdio.h"intmain(){printf("hello");}>./gcc.exe-ohello.exeHello.c>./hello.exe......
  • hyperscan编译
    hyperscan是intel开发的用于高效正则匹配的工具。适用场景就是数据量大,性能要求高,匹配关键字领域。hyperscan会把需要检测的关键字/正则表达式转换成对应的db数据,然后使用这些db数据进行匹配。所以如果数据更改了,需要重新创建。理论上只能在intel的x86架构下才可以正常使用,因为i......
  • 微信小程序反编译
    微信小程序反编译工具准备1.模拟器(夜神,逍遥等都可以)2.模拟器里的微信3.模拟器里的RE管理工具,这个可以现在物理机里下载了apk文件,然后拖到模拟器里4.安装nodejs环境https://www.swvq.com/link/to?link=https://nodejs.org/en/5.反编译工具链接:https://pan.baidu.com/s......
  • 静态编译 PHP 8 系列、PHP7.4 、PHP7.3
    静态编译PHP运行时文档说明:只记录关键的地方;发布时间:2023-08-07备注:macos环境下不需要启动容器环境,直接构建即可PHP原生构建选项文档php7.4、7.3分支需要单独克隆(区别:openss使用v1版本,curl库不启用http2库http3库)复用swoole-cli编写......