huanhuan 发表于 2010-4-15 18:37:35

Mega16上AvrX实时操作系统的简单应用——Nokia3310手机屏的模拟钟

首先感谢ourdev,这是个很好的学习交流场所,让我学到不少,今天发一个关于AVR单片机操作系统AvrX的文章
由于还没研究操作系统的底层汇编代码,这里也不敢大话,只简单介绍一下应用方法,先看一下界面,
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_546620.jpg
(原文件名:图像008.jpg)
首先从网上下载AvrX 2.6f 的源码www.barello.net,修改其中的Makefile MCU类型,编译。在自己的应用中包含其头文件“avrx-io.h”、“avrx-signal.h”、“avrx.h”,
AvrX系统的应用中包括main()、AVRX_SIGINT(SIG_OVERFLOW0)、至少两个Task等。
编程时可认为单片机从main()函数开始执行,main()函数有如下特征:
int main(void)
{
    AvrXSetKernelStack(0); // 设置操作系统内核堆栈
   
    nlcd_init();                  //
    nlcd_plot_circle(23, 23, 23);   // 设备初始化
    clock_plot_scale();             //
       
    MCUCR = 1<<SE;
    TCNT0 = TCNT0_INIT;            // 定时器初始化,1ms定时,TCNT0_INIT 在hardware.h 中指定
    TCCR0 = TMC8_CK256;
    TIMSK = 1<<TOIE0;
       
///
    AvrXRunTask(TCB(task1));   //
    AvrXRunTask(TCB(task2));   // 装入任务
    //AvrXRunTask(TCB(task3)); //
       
////
    Epilog();                   // Switch from AvrX Stack to first task
    while(1);
}
我这次的程序只用了两个任务,任务1与任务2通过Message联系,任务1简单的依靠定时器定时计数更改显示信息,任务2简单的负责刷新屏幕。两个任务稍后附上源代码。
AvrX操作系统提供了40个API函数,可分为6大类:
Tasking (任务级)
Semaphores (信号量管理)
Timer Management (定时器时间队列管理)
Message Queues (消息管理)
Single Step Debugging support (单步运行支持)
Byte FIFO support with synchronization (字节FIFO支持)

这次的程序简单的用到了Timer Management 和 Message Queues 里面的几个API:
AvrXStartTimer
AvrXWaitTimer
AvrXSendMessage
AvrXWaitMessage

Task1 代码如下:
AVRX_GCC_TASKDEF(task1, 75, 1) // clock timer
{
    while(1)
    {
      AvrXStartTimer(&timer1, 499);
      AvrXWaitTimer(&timer1);
      half_second = !half_second;
      // ////////////////////////////////////////
      if(half_second)
      {
            clock_intplot_hand(23, 23, second, SECOND_HAND);
            if(second - minute < 3 || minute - second < 3)
                clock_plot_hand(23, 23, minute, MINUTE_HAND);
            if(second - hour < 3 || hour - second < 3)
                clock_plot_hand(23, 23, hour, HOUR_HAND);
            /////////////////////////////////////////////
            second ++;
            if(second > 59)
            {
                second = 0;
                clock_intplot_hand(23, 23, minute, MINUTE_HAND);
                if(minute - hour < 3 || hour - minute < 3)
                clock_plot_hand(23, 23, hour, HOUR_HAND);
                minute ++;
                if(minute % 12 == 0)
                {
                  if(minute == 60)
                        minute = 0;
                  clock_intplot_hand(23, 23, hour, HOUR_HAND);
                  hour ++;
                  if(hour > 59)
                        hour = 0;
                  clock_plot_hand(23, 23, hour, HOUR_HAND);
                }
                clock_plot_hand(23, 23, minute, MINUTE_HAND);
            }
            clock_plot_hand(23, 23, second, SECOND_HAND);
      }
      else;
      AvrXSendMessage(&myQueue, &second_step);
    }
}
Task1 的任务是钟表计时,并重绘钟表指针,然后调用AvrXSendMessage系统函数向消息队列myQueue中发送消息second_step。而Task2就是一直在等待消息。
函数clock_plot_hand( , , , )是绘制时钟指针函数,前两个参数是时钟中心点位置,最后一个参数是说明什么类型的针,秒针,分针或失真。该函数的原型在ckock.h中声明,具体实现代码可参考附件的clock.c 文件。

Task2的代码如下:
AVRX_GCC_TASKDEF(task2, 70, 3) //display all
{
    MessageControlBlock *p;
    while(1)
    {
      p = AvrXWaitMessage(&myQueue);
      if(p == &second_step)
      {
            nlcd_plot_circle(23, 23, 23);
            clock_plot_scale();
            nlcd_show_all();
            nlcd_wrtchar( 9, 5, (hour / 12) / 10 + '0');
            nlcd_wrtchar(10, 5, (hour / 12) % 10 + '0');
            nlcd_wrtchar(12, 5, minute / 10 + '0');
            nlcd_wrtchar(13, 5, minute % 10 + '0');
            if(half_second)
                nlcd_wrtchar(11, 5, ':');
            else
                nlcd_wrtchar(11, 5, ' ');
      }
      else;
            //AvrXHalt();
    }
}

所有的函数具体代码可参考附件,点击此处下载 ourdev_546621.rar(文件大小:14K) (原文件名:ExampleOfAvrX.rar)

该应用的架构层次比较清晰。接下来研究下AvrX的系统代码,

huanhuan 发表于 2010-4-15 18:40:03

程序有错误,在小时的显示上,不好意思,
nlcd_wrtchar( 9, 5, (hour / 5) / 10 + '0');
nlcd_wrtchar(10, 5, (hour / 5) % 10 + '0');

tear086 发表于 2010-4-15 18:43:44

收藏,谢谢楼主哥。

ivws 发表于 2010-4-15 19:09:00

标记一下!

yaya001 发表于 2010-4-16 17:11:55

标记一下

mcu_lover 发表于 2010-4-16 17:50:17

谢谢

vbcode 发表于 2010-4-16 19:35:46

收藏了 谢谢 好东西

liangyurongde 发表于 2010-4-16 22:43:24

mark

yusufu 发表于 2010-4-17 01:19:42

不错,mark了~

Swallow 发表于 2010-4-17 07:39:38

记号!

bluefeel 发表于 2010-4-17 07:44:59

mark

span42 发表于 2010-5-7 08:43:40

mark

zhangP 发表于 2010-5-31 11:24:27

楼主你好,我刚接触AVRX,在内核编译上出现了问题,或许是makefile文件出现了问题,方便和你交流一下吗?我的邮箱 zhangpeng.q.q@163.com

hy317 发表于 2010-5-31 11:29:38

mark

Gorgon_Meducer 发表于 2010-5-31 13:49:04

以下蓝色文字由版主:Gorgon Meducer 于:2010-05-31,13:49:04 加入。<font color=black>请发贴人注意:本贴放在这分区不合适,即将移走
原来分区:AVR32技术论坛
即将移去的分区:AVR (原ourAVR.com) 技术论坛
移动执行时间:自本贴发表0小时后
任何的疑问或咨询,请可随时联系站长。谢谢你的支持!</font>

number007cool 发表于 2010-6-1 10:42:05

mark!

charlie2008 发表于 2010-6-1 12:40:21

mark!

1181zjf 发表于 2010-6-1 13:23:42

mark

lv998127 发表于 2010-6-1 14:22:58

标记下

zengyi703 发表于 2010-6-1 22:22:33

mark

super373 发表于 2010-6-1 23:26:39

潜力股
楼主继续努力

june4th 发表于 2010-6-2 00:50:22

不错

xumcu 发表于 2010-6-4 22:25:21

原来这么好玩

xuhaikun 发表于 2010-8-6 10:48:51

强烈顶起

zywh 发表于 2010-8-6 14:14:59

mark。。。。。。。。。。。

wodeworld1234 发表于 2010-8-14 23:32:33

学习中

sn2101 发表于 2010-8-15 09:11:50

学习

cuikai12345 发表于 2010-8-15 11:12:04

mark

lj_3915 发表于 2010-8-15 11:32:27

好文章,希望有深入的研究!

dogg 发表于 2010-8-15 13:27:56

留个爪印

xuhaikun 发表于 2010-8-16 01:47:27

请问能不能再详细描述一下如何建立一个工程的?谢谢,希望能描述一下AVR Stdio +WinAVR下建立AVRX工程的步骤,再谢。。。

grenpine 发表于 2010-8-16 09:16:21

mark

lvhaian 发表于 2010-8-16 09:26:55

还真不容易啊。 对囊中羞涩的大学生而言绝对是个不错的东西。

yaojinhao 发表于 2010-8-16 17:20:57

记号

edaworld 发表于 2010-8-16 19:31:51

mark

ADO1234 发表于 2010-8-16 20:51:09

MARK

xuhaikun 发表于 2010-8-18 10:56:41

请问能不能再详细描述一下如何建立一个工程的?谢谢,希望能描述一下AVR Stdio +WinAVR下建立AVRX工程的步骤,再谢。。。

caoxin90626 发表于 2010-10-18 23:26:05

我最近也在研究这个屏幕!!1

beixue 发表于 2010-10-19 10:41:46

mark

gaobao_1 发表于 2013-11-20 11:28:43

谢谢!学习一下

horary 发表于 2020-5-22 14:02:31

顶一下,学习学习!
页: [1]
查看完整版本: Mega16上AvrX实时操作系统的简单应用——Nokia3310手机屏的模拟钟