最近打算自己定制一个Arduino的板子,改改Arduino的烧写机制。好在bootloader都是有源代码的,说干就干,改写前当然要试试这个源码能不能编译,可是到了bootloader目录就茫然了。。。。。竟然用的是makefile,可是作为一名程序猿当然不能退缩了。。。

  1、找到bootloader源码

  bootloader的源码都在\arduino-1.6.9\hardware\arduino\avr\bootloaders文件夹下,不同的单片机芯片或者arduino板有不同的文件夹,就拿最廉价的atmega8下手吧,正好我也有很多usbasp的pcb可以改改。进入到atmega8目录,可以看到下边有几个文件,毫无疑问.c文件就是源码了,暂时不修改源码,只是尝试编译一下,所以这次先不讲解.c文件,还有两个.hex的文件,这是实现编译好的hex文件,当新做的arduino板连接到ide烧写bootloader时,就是用的这里的hex,这个hex也没啥好说的。最后一个文件就是makefile了,makefile一般只有牛x的程序员才会编写,我一般都是照葫芦画瓢,但是为了折腾,还是得上。。。。

  2、寻找make.exe

  虽然没有写过makefile,至少见过makefile,之前没有读过多少书,编译程序次数多了多少也看出来一些门道。每次编译总是需要输入make命令,用ide编译的时候隐约可以看到开始前命令行中有make的影子。所以我如果要编译要先找找make.exe在哪里。于是在arduino的目录中搜索,但是很失望没有。。。。于是挨着翻看了一下arduino的目录,细心的我发现之前的arduino版本都带有winavr,貌似最新版没有了。于是找了个老版本看了看,果不其然老版本中有make.exe,于是赶紧下载一个winavr装上(装在任何目录都可以),终于看到了久违的make.exe。

  3、初次尝试编译

  既然有了make.exe,那开始编译吧,首先进入atmega8目录,调用make.exe命令(注意winavr安装的路径不同,命令不同,请根据自己安装的目录调整),我调用的命令如下:

  c:\winavr-20081205\utils\bin\make.exe

  想法总是美好的,可是现实总是残酷的。。。。当然编译bootloader报错了。。。错了。。。了。。。

  

  4、修改makefile

  不管怎么样,还是擦干泪水继续奋斗呀,其实仔细看看那个错误信息,似乎也很明确。。。。找不到指定的文件,看看上边的命令/bin/avr-gcc,貌似还真没有这个文件,/分明是linux的路径,我这里可是windows,打开makefile看看,

  很快就找到原因所在了。。。

  仔细看不难看出avr-gcc的路径是通过DIRAVRBIN来定义的,而DIRAVRBIN又是通过DIRAVR这个变量来获取的,并且文件中这个变量被注释了。。。。如下是修改前的代码

 #DIRAVR = /usr/local/avr
DIRAVRBIN = $(DIRAVR)/bin
DIRAVRUTILS = $(DIRAVR)/utils/bin
DIRINC = $(DIRAVR)/include
DIRLIB = $(DIRAVR)/avr/lib

  既然看出问题所在了,那就修改一下就好了,通过搜索可以找到avr-gcc所在的目录,并且可以确定出avr-gcc所在的目录相对于makefile所在的目录的相对路径是:..\..\..\..\tools\avr\bin,所以makefile修改后如下:

 DIRAVR = ..\..\..\..\tools\avr
DIRAVRBIN = $(DIRAVR)/bin
DIRAVRUTILS = $(DIRAVR)/utils/bin
DIRINC = $(DIRAVR)/include
DIRLIB = $(DIRAVR)/avr/lib

  再次运行c:\winavr-20081205\utils\bin\make.exe hex终于看到了新的hex文件。。。。

Arduino编译bootloader的更多相关文章

  1. 浅谈arduino的bootloader

    在arduino的板子上,作为核心的avr单片机往往都会烧录一个bootloader,这个叫做bootloader的东东其实是arduino研发团队针对arduino板子开发的一小段代码,借助于这段代 ...

  2. Pandaboard ES编译bootloader、xloader、内核、以及安卓系统

    Building bootloader and kernel Bootloader Startwith building the bootloader. To learn more about the ...

  3. Arduino、bootloader、BadUSB、及其相关硬件知识入门学习

    内容中包含 base64string 图片造成字符过多,拒绝显示

  4. 基于Proteus仿真的Arduino学习(1)——Arduino Uno最小系统及LED的简单使用

    一.前言:  A.Arduino简介 Arduino是由一个欧洲开发团队于2005年冬季开发.其成员包括Massimo Banzi.David Cuartielles.Tom Igoe.Gianluc ...

  5. 在ubuntu14.04上编译android4.2.2系统

    原创作品,转载请注明出处,严禁非法转载             copyright:weishusheng   2015.8.1 时下android系统非常流行,下面就来说一下,下载编译一个andro ...

  6. 【转】高通平台android 环境配置编译及开发经验总结

    原文网址:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通 ...

  7. Arduino使用注意问题及编程相关

    1.Arduino的概念 arduino是一款便捷灵活方便上手的开源电子原型平台,包含硬件(各种型号的arduino板)和软件(arduino IDE), 是一个基于开放原始码的软硬件平台,构建于开放 ...

  8. Android 系统编译

    最近研究了下Android 的编译系统,下面结合编译我们自己的产品 mobot 来对整个编译系统进行必要的介绍,方便大家今 后对默认编译的修改. 先列出几个觉得重要的Make 文件: build/bu ...

  9. AVR之BOOTLOADER技术详解(转)

    源:http://blog.csdn.net/zhenhua10/article/details/6442412 ATmega128具备引导加载支持的用户程序自编程功能(In-System Progr ...

随机推荐

  1. window7使用svn(svn系列 客户端 知识二总结)

     ♣eclipse插件subclipse  ♣TortoiseSVN  ♣svn操作  ♣注意事项 使用svn可以在eclipse直接装subclipse或者在windows使用TortoiseSVN ...

  2. 20155205 2016-2017-2 《Java程序设计》第4周学习总结

    20155205 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 private成员会被继承,只不过子类无法直接存取,必须通过父类提供的方法来存取(若 ...

  3. 实现标签的添加与删除(tags)

    在项目中会遇到,标签(tags)的添加与去除的需求 demo:我们有 tags   '专利','商标','版权','域名' demand:在发布内容的时候,要求可以添加tag,(实现tag的增加与删除 ...

  4. 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列

    老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列   事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些 ...

  5. Java中一个方法只被一个线程调用一次

    1.想在运行时抛出异常,终止方法的运行 private final Set<Long> THREADS = new HashSet<>(); public void someM ...

  6. iOS项目之模拟请求数据

    如何在iOS开发中更好的做假数据? 当工期比较紧的时候,项目开发中会经常出现移动端等待后端接口数据的情形,不但耽误项目进度,更让人有种无奈的绝望.所以在开发中,我们常常自己做些假数据,以方便开发和UI ...

  7. Ubuntu 分辨率调整及操作问题解决

    步骤: 1.在控制窗口上:点击  设备--->安装则鞥强功能:如图1: 若点击后出现图2的情况,则在左边找到光盘图标,右键-->弹出(图3): 然后再重复本步骤: 图1 图2 图3 2.在 ...

  8. C#变量、常量、枚举、预处理器指令知多少

    一.变量 C#共有其中变量类型有:静态变量.实类变量.数组元素.数值参数.引用参数.输出参数和局部变量 先定义一个简单的类来说明,如下: public class VariableDefine { p ...

  9. Java NIO之通道

    一.前言 前面学习了缓冲区的相关知识点,接下来学习通道. 二.通道 2.1 层次结构图 对于通道的类层次结构如下图所示. 其中,Channel是所有类的父类,其定义了通道的基本操作.从 Channel ...

  10. linux入门之用户管理

    用户管理 添加用户 以root用户执行 adduser  或 useradd [new_account] -u  UID   -d 指定家目录 -g GID 指定一个基本组ID   -G指定一个附加组 ...