miaow1988 发表于 2008-8-10 22:09:19

AVRX初步:编译AVRX和运行例子(原创)

最近心血来潮,想要玩玩AVRX,google上搜索AVRX有4000个结果,不过大多是千遍一律的那几篇文章。
有一篇被传得很广的文章里面详细的讲了AVRX的安装,但是那是针对 AVRX2.6e 的,现在最新的是AVRX2.6f了,所以那篇文章里面的东西基本就无效了,因为2.6f里面的makefile大不一样。
我用的是WINAVR和atmege8,这里它们为例。
首先,下载解压,注意最好解压到某个盘的根目录,得到四个文件夹:
AvrX      -AVRX的核心
Examples        -例子
TestCases        -修改核心后用来对自己的修改进行测试的,绝大多数情况我们用不着,除非你真的去修改AVRX的源代码。反正我是连看都看不懂,更别提改了。
AvrXserialIO    -AVRX串口的头文件和例子。具体我还在研究中。

下面就开始编译AvrX和其例子:
一、编译AvrX:
1.修改AvrX目录里面的makefile,把里面MCU = at90s8515改为MCU = atmega8。//如果你用其他MCU,就按需修改。
2.在命令提示符下进入Avrx目录,使用make命令,编译成功,产生一大堆文件,最重要的是我们要的是其中的avrx.a,这就是编译出的AvrX的内核。


二、编译AvrX的例子:绝大多数人上面两个步骤都搞的定,却倒在了编译例子上。
1.首先,如果使用mega8,要修改例子中的hardware.h,我们在hardware.h可以看到:
#define LED PORTB         // Change this per your hardware and jumper setup
#define LEDDDR DDRB         //没有问题

#define SWITCH PINA
#define SWITCHP PORTA       //有问题,mega8没有A口,之有B、C、D。


所以我们要改成
#define LED PORTB         // Change this per your hardware and jumper setup
#define LEDDDR DDRB         //没有问题

#define SWITCH PINC
#define SWITCHP PORTC       //有问题,mega8没有A口,只有B、C、D。

2.同样,修改例子的makefile:
把里面的:
MCU      = atmega128
改为:
MCU = atmega8。//如果你用其他MCU,就按需修改。

3.接下来是难住绝大多数人的问题:serialio.S。
我么可以发现,serialio.S在编译AvrX核心的时候没有被编译,因为他是可选的组建,我们可以不用它,但是例子里面用到了它。
AvrX几年没有更新了,serialio.S对MCU的支持不完全,所以我们不能在mega8里直接使用serialio.S,因为默认的serialio.S里面所定义的寄存器名字和mega8是不兼容的,我们要修改serialio.S使其兼容。
具体方法是:
找到serialio.S文件里如下一段:
#if defined(UCSRB)
#        define UCR UCSRB
#endif
#if defined(UCSRA)
#        define USR UCSRA
#endif
#if defined(UCSR0B)
#        define UCR UCSR0B
#endif
#if defined(UCSR0A)
#        define USR UCSR0A
#endif
#if defined(UDR0)
#        define UDR UDR0
#endif
#if defined(UBRR0L)
#        define UBRR UBRR0L
#endif
在这段代码后面加上:
#if defined(UBRRL)
#        define UBRR UBRRL
#endif
搞定了,在命令提示符下进入Examples目录,使用make命令,编译成功,产生一大堆文件,包括我们要的hex,cof等等,这就是编译出的AvrX的例子。

例子有五个:
Timers.c        - Shows how to set up the AvrX Timer Queue mechanism,
                start timers and wait for them.

Messages.c        - Application showing the use of multiple messages to
                communicate between applications

MessageAndData.c
              - Application showing the use of data structure tacked
              on to a message for passing information between processes.

MessageTimers.c - Application showing the use of EVENTS
                to implement an asyncronous timeout while waiting for a
                message.

MessageTimersAlt.c - an alternate way to structure the code.

下载Timers到mege8运行(注意,这里所有例子都使用8m内部RC振荡),在PB0和PB1上接上LED,可以看到PB0和PB1的引脚电平按时变化。


至此结束。

wangguanfu 发表于 2008-8-10 23:18:29

应该穿裤子,标记一下

stephon1 发表于 2008-8-11 09:01:54

喜欢笔记

yaya001 发表于 2008-8-11 16:10:49

留个记号 谢谢

cjr82123 发表于 2009-7-25 11:33:57

MARK!

xqingfeng 发表于 2009-7-27 17:16:11

标记

szjdb 发表于 2009-7-27 21:28:44

吐心之作,谢谢!

nini 发表于 2009-12-3 22:23:07

难得有说的这么清楚的一篇文章,谢谢

hangbaby 发表于 2010-8-31 10:24:29

回复【楼主位】miaow1988
-----------------------------------------------------------------------

请求编译生成库文件(在修改完Makefile文件后的运行make gcc)具体步骤,希望给截图加步骤,

twl 发表于 2012-9-12 15:38:24

谢谢,给出详细的操作步骤,终于可以编译,运行了.

jinshaopu 发表于 2014-7-7 09:51:46

本帖最后由 jinshaopu 于 2014-7-7 09:53 编辑

看样子是要挖坟了   只是我按上面步骤操作怎么
serialio.s:272:constant value required
serialio.s:291:constant value required
serialio.s:302:constant value required
serialio.s:321:constant value required
serialio.s:325:constant value required
页: [1]
查看完整版本: AVRX初步:编译AVRX和运行例子(原创)