OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2781|回复: 4

stm8并行多任务

[复制链接]

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2016-9-22
在线时间
38 小时
发表于 2016-11-26 08:46:45 | 显示全部楼层 |阅读模式
1金钱
  现在手头有个小项目,遇到了些问题,请大神赐教!使用的芯片是stm8s207s8   整个系统包括:1、软件模拟的iic通讯,与触摸ic通讯,判断按键。2、与595通讯,控制按键灯。3、用uart1与语音ic通讯,实时控制播报语音。4、用uart3与指纹模块通讯,以一定频率采集指纹头上的指纹。5、使用一个io口与射频ic通讯,软件解码。     整个系统,需要实时扫描的就只有三个,即:扫描指纹、扫描射频卡、扫描按键。这三个封装函数我都有写好,因为这三个函数里面都涉及语音播报,语音播报是这样一个流程:发送一段指令码,控制语音ic播报指定的一段语音,语音ic成功接收到信号,会返回“ok”,播放完毕会返回“stop”。大家都知道语音播放需要一定时间,我现在写的语音通讯函数,直接用的while((UART1_SR&0X20)==0);这样写有一个坏处,接收这段语音如果有20s,单片机就只能在这等20s,什么别的事都做不了。
     另外,这个项目我启用了3个定时器,设置了相同的频率,把三个扫描函数分别放入一个定时器中断函数中,但我发现他们之间还是会有相互干扰,因为指纹扫描不需要很快1s扫描3次左右足够了,每当指纹通讯时,指纹模块的灯亮,此时如果你要是按密码键盘,根本没有任何反应,后来我就想,设置不同的指纹扫描频率,毕竟你在输入密码的时候,不可能同时输入指纹,只要有按键被按下,在一定时间内,指纹以5s一次扫描,过了这个设定的时间就以1s 3次的速度扫描。这样改良后,效果是比开始好了,但还是感觉有时候,会和扫描射频卡的函数,相冲突。
     其实自己的开发经验挺少的,刚毕业,一直都是裸奔,后来我就在网上查找,单片机跑小系统,并行多任务。大致了解了下ROTS_52,也就4个文件,挺小巧的,但我有些疑问,如果移植到我的项目中,在每个task中有延时该怎么处理,像语音通讯这种几秒中的等待该怎么处理。求大神指教!!!!
     /********************************
*FileName:         MAIN_C
*Author         :   JZHG1992
*Versions:         V1.0
*********************************/

#include "OS.h"


/************************************
*                 主函数
*************************************/

void main( void )
{
        uchar i;

        OS_Timer0_Init();         // 系统定时器时钟初始化
        EA = 1;                                          // 开总中断
        while(1)
        {
                for ( i=0; i<TASK_MAX; i++ )
                {
                        if ( Task_Delay == 0 )
                        {
                                OS_Task_Run( task );
                                break;
                        }
                }
        }                                                               
}


/********************************
*FileName:         OS_C
*Author         :   JZHG1992
*Versions:         V1.0
*********************************/

#include "OS.H"

/************************************
*                 系统任务执行频度参数
*************************************/

uchar Task_Delay[TASK_MAX];

/************************************
*                 系统定时器时钟初始化
*************************************/

void OS_Timer0_Init( void )
{
        uchar i;

        for ( i=0; i<TASK_MAX; i++ )
        {
                Task_Delay = 0;   // 复位系统任务执行频度参数               
        }
        TMOD = (TMOD&0xf0)|0x01; // 设置定时器0方式1
        TH0 = 256-(OS_CLOCK/TASK_CLOCK)/12/256; // 赋初值200Hz
        TL0 = 256-(OS_CLOCK/TASK_CLOCK)/12%256;
        TR0 = 1;  // 使能定时器0
        ET0 = 1;  // 使能定时器0中断
}

/************************************
*                 系统任务调度函数
*************************************/

void OS_Task_Run( void (*ptask)() )
{
        (*ptask)();
}

/************************************
*                 系统中断服务函数
*************************************/

void OS_ISR( void ) interrupt 1
{
        uchar i;

           TH0 = 256-(OS_CLOCK/TASK_CLOCK)/12/256; // 赋初值200Hz
        TL0 = 256-(OS_CLOCK/TASK_CLOCK)/12%256;
        for ( i=0; i<TASK_MAX; i++ )
        {
                if ( Task_Delay )Task_Delay --;
        }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-11-26 10:00:13 | 显示全部楼层
2个uart的收发都用环形缓冲区在中断里面接收和发送,这样可以避免空等时间。
你对时间要求高的,裸机做不到,跑RTOS一样不容易做到,没有真正的并行任务,别想着跑RTOS就可以解决这个问题

5、使用一个io口与射频ic通讯,软件解码。这个不清楚你的流程。
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2016-9-22
在线时间
38 小时
 楼主| 发表于 2016-11-26 10:13:04 | 显示全部楼层
憨厚诚实大叔 发表于 2016-11-26 10:00
2个uart的收发都用环形缓冲区在中断里面接收和发送,这样可以避免空等时间。
你对时间要求高的,裸机做不 ...

这个用的是射频ic U2270B 输出只有一根线,曼切斯特解码
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-11-26 10:52:02 | 显示全部楼层
帮顶,关注这个问题。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

2

主题

50

帖子

0

精华

高级会员

Rank: 4

积分
507
金钱
507
注册时间
2015-2-11
在线时间
121 小时
发表于 2016-11-26 19:37:45 | 显示全部楼层
怎么看起来像51的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 15:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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