打印
[新手园地]

【第四批】Metalor笔记2 - 尽情裸奔~

[复制链接]
1665|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Metalor|  楼主 | 2011-11-19 19:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
没玩过OS,只能裸奔。。
一直没什么空,抓紧周末的时间把框架建起来了。
程序有个好的框架可以到达事半功倍的效果,框架已建立起来,只需往里面添砖加瓦就可以了。
整个系统基于一个5ms的系统“嘀嗒”(有些人偏爱2ms,看情况决定吧),在此基础上来产生10ms和20ms时间片,实时性要求特别严格的任务可添加到5ms中断程序里面,但一般不建议如此。
主循环主要运行10ms和20ms的两个服务程序,应付实时处理足够,具备简单的任务缓冲能力。
一些“慢”的处理(如1s运行一次),则进一步在10ms或20ms里面来产生更大的时间片,以此类推。
现框架内暂时只有一个1s的流水灯程序,需要什么可以往里面任意增加。
还有就是整个框架的Flag的使用是比较节省空间的做法,在大量使用标志位时,相当于使用了bit变量。
本框架还是比较简单的,少量注释,希望对大家有益。

另,定时时间不是太准,比计算出来的稍慢,不知是晶振原因还是什么,家里没有仪器,无从得知。

systick.c:
#include "includes.h"

uint8_t Time1sCounter    = 0;
uint8_t Time10msCounter  = 0;
uint8_t Time20msCounter  = 1;
uint8_t Time100msCounter = 0;
         

/*************************************************************************************
** Function name:       SysTick_Configuration
** Descriptions:        配置系统滴答定时器SysTick
*************************************************************************************/
void SysTick_Configuration(void)
{         
    DrvSYS_SelectSysTickSource(0);                // 为SYSTICK选用外部12M晶振
        SysTick->CTRL = 0x00000003;                 //[SYST_CSR]向下计数到0将引起SysTick 异常而挂起(进入中断) 计数器运行
        SysTick->VAL  = 0x00000000;                 //[SYST_CVR]该向SYST_CVR寄存器写入0样确保定时器以SYST_RVR中的值计数,而非任意值
        SysTick->LOAD = 55100;                                 //about 5ms(Normally,this value is 60000,but in fact 55100 is better)
//        printf("SysTick 初始完成!!\n");
}
/*************************************************************************************
** Function name:                 SysTick_Handler
** Descriptions:                 系统滴答定时器SysTick中断函数
** Remark:                                5ms计数一次
*************************************************************************************/
void SysTick_Handler(void)
{
        Time10msCounter++;
        Time20msCounter++;

        if(Time10msCounter == 2)
        {
                Time10msCounter = 0;
                Time10ms_f      = TRUE;        
        }
        if(Time20msCounter == 4)
        {
                Time20msCounter = 0;
                Time20ms_f      = TRUE;        
        }
}//SysTick_Handler

void v10msServe(void)
{
        if(Time10ms_f)
        {
                Time10ms_f = FALSE;

                //Add 10ms function here
        }
}//v10msServe

void v20msServe(void)
{        if(Time20ms_f)
        {
                Time20ms_f = FALSE;

                v1sDriver();
                v1sServe();
                //Add 20ms function here
        }
}//v20msServe

void v1sServe(void)
{
        if(Time1s_f)        //1s
        {
                Time1s_f = FALSE;

                vLED_Scroll();
                //Add 1s function here
        }
}//v1sServe

void v1sDriver(void)
{
        Time1sCounter++;
        if(Time1sCounter == 50)
        {
                Time1sCounter = 0;
                Time1s_f      = TRUE;
        }
}//v1sDriver

裸奔 By Metalor.rar (1.53 MB)

相关帖子

沙发
Metalor|  楼主 | 2011-11-19 19:14 | 只看该作者
第一次发错了发到了圈圈板块。
这次转过来~

使用特权

评论回复
板凳
hotpower| | 2011-11-19 21:06 | 只看该作者
CortexM有专门的节拍定时器,不错。
这种架构最常见,主要是简单,占用资源少。
一般都是协作完成。

使用特权

评论回复
地板
Metalor|  楼主 | 2011-11-25 10:18 | 只看该作者
另,定时时间不是太准,比计算出来的稍慢,不知是晶振原因还是什么,家里没有仪器,无从得知。
Metalor 发表于 2011-11-19 19:13


https://bbs.21ic.com/icview-286387-1-1.html

做裸奔框架时就表示过对系统速度的怀疑,当时一直觉得“慢了点”,但实在太忙,只能知其然不知其所以然。。
为了把时间调得尽量准,我掐着秒表对着1S的流水灯调了好大一会儿才慢慢接近了。。
但肯定这样是不可能准确的,因为裸奔框架的需要,只能是尽量弄得准一点了。
Ryanhsiung兄解疑,好样的!

使用特权

评论回复
5
Metalor|  楼主 | 2011-11-25 10:20 | 只看该作者
擦。。发错地方了。。。。。。。。。

楼上的需要传送门:https://bbs.21ic.com/icview-287955-1-1.html

使用特权

评论回复
6
Ryanhsiung| | 2011-11-25 12:21 | 只看该作者
不用谢,我犯了同样的错误

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

224

帖子

1

粉丝