搜索
bottom↓
回复: 40

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

[复制链接]

出0入0汤圆

发表于 2010-4-15 18:37:35 | 显示全部楼层 |阅读模式
首先感谢ourdev,这是个很好的学习交流场所,让我学到不少,今天发一个关于AVR单片机操作系统AvrX的文章
由于还没研究操作系统的底层汇编代码,这里也不敢大话,只简单介绍一下应用方法,先看一下界面,

(原文件名:图像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的系统代码,

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2010-4-15 18:40:03 | 显示全部楼层
程序有错误,在小时的显示上,不好意思,
nlcd_wrtchar( 9, 5, (hour / 5) / 10 + '0');
nlcd_wrtchar(10, 5, (hour / 5) % 10 + '0');

出0入0汤圆

发表于 2010-4-15 18:43:44 | 显示全部楼层
收藏,谢谢楼主哥。

出0入0汤圆

发表于 2010-4-15 19:09:00 | 显示全部楼层
标记一下!

出0入0汤圆

发表于 2010-4-16 17:11:55 | 显示全部楼层
标记一下

出0入264汤圆

发表于 2010-4-16 17:50:17 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2010-4-16 19:35:46 | 显示全部楼层
收藏了 谢谢 好东西

出0入9汤圆

发表于 2010-4-16 22:43:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-17 01:19:42 | 显示全部楼层
不错,mark了~

出0入0汤圆

发表于 2010-4-17 07:39:38 | 显示全部楼层
记号!

出0入85汤圆

发表于 2010-4-17 07:44:59 | 显示全部楼层
mark

出0入50汤圆

发表于 2010-5-7 08:43:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-31 11:24:27 | 显示全部楼层
楼主你好,我刚接触AVRX,在内核编译上出现了问题,或许是makefile文件出现了问题,方便和你交流一下吗?我的邮箱 zhangpeng.q.q@163.com

出0入0汤圆

发表于 2010-5-31 11:29:38 | 显示全部楼层
mark

出0入296汤圆

发表于 2010-5-31 13:49:04 | 显示全部楼层
以下蓝色文字由版主:Gorgon Meducer 于:2010-05-31,13:49:04 加入。
<font color=black>请发贴人注意:
本贴放在这分区不合适,即将移走
原来分区:[1030]AVR32技术论坛
即将移去的分区:[1000]AVR (原ourAVR.com) 技术论坛
移动执行时间:自本贴发表0小时后

任何的疑问或咨询,请可随时联系站长。谢谢你的支持!
</font>

出0入0汤圆

发表于 2010-6-1 10:42:05 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-6-1 12:40:21 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-6-1 13:23:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-1 14:22:58 | 显示全部楼层
标记下

出0入0汤圆

发表于 2010-6-1 22:22:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-1 23:26:39 | 显示全部楼层
潜力股
楼主继续努力

出0入0汤圆

发表于 2010-6-2 00:50:22 | 显示全部楼层
不错

出0入0汤圆

发表于 2010-6-4 22:25:21 | 显示全部楼层
原来这么好玩

出0入0汤圆

发表于 2010-8-6 10:48:51 | 显示全部楼层
强烈顶起

出0入0汤圆

发表于 2010-8-6 14:14:59 | 显示全部楼层
mark。。。。。。。。。。。

出0入0汤圆

发表于 2010-8-14 23:32:33 | 显示全部楼层
学习中

出0入0汤圆

发表于 2010-8-15 09:11:50 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-8-15 11:12:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-15 11:32:27 | 显示全部楼层
好文章,希望有深入的研究!

出0入4汤圆

发表于 2010-8-15 13:27:56 | 显示全部楼层
留个爪印

出0入0汤圆

发表于 2010-8-16 01:47:27 | 显示全部楼层
请问能不能再详细描述一下如何建立一个工程的?谢谢,希望能描述一下AVR Stdio +WinAVR下建立AVRX工程的步骤,再谢。。。

出0入0汤圆

发表于 2010-8-16 09:16:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-16 09:26:55 | 显示全部楼层
还真不容易啊。 对囊中羞涩的大学生而言绝对是个不错的东西。

出0入0汤圆

发表于 2010-8-16 17:20:57 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-8-16 19:31:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-16 20:51:09 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-8-18 10:56:41 | 显示全部楼层
请问能不能再详细描述一下如何建立一个工程的?谢谢,希望能描述一下AVR Stdio +WinAVR下建立AVRX工程的步骤,再谢。。。

出0入0汤圆

发表于 2010-10-18 23:26:05 | 显示全部楼层
我最近也在研究这个屏幕!!1

出0入0汤圆

发表于 2010-10-19 10:41:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-11-20 11:28:43 | 显示全部楼层
谢谢!学习一下

出0入0汤圆

发表于 2020-5-22 14:02:31 | 显示全部楼层
顶一下,学习学习!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 04:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表