资深雨粉 发表于 2018-11-3 14:54:25

单片机怎么在灯闪烁的同时去做另一件事情呢?


程序中定时1s和10s有什么问题没有

BOOLvolatileled_flag;
BOOLvolatileflag_1s;
BOOLvolatileflag_10s;

void Sys_10ms_Interrupt(void) //10ms中断函数
{
        static volatileu16 led_timer = 0;
        static volatileu16 count_timer = 0;
        static volatileu16 count_timer2 = 0;
        count_timer++;
        flag_1s = 0;
        if(count_timer%100 == 0)       
        {       
                flag_1s = 1;          //1s定时
                count_timer2++;
                if(count_timer2 == 10)
                {                  
                        flag_10s = 1;       //10s定时
                        count_timer2 = 0;
                }
        }
        led_timer++;
        if(led_timer>10) //100ms 反转
        {
                led_flag =~led_flag;
                led_timer = 0;
        }
}

carollim 发表于 2018-11-3 15:05:11

直接是否等于100不好吗

pisgah 发表于 2018-11-3 15:06:07

这是中断函式,在主函式内做你的其他事情(另一件事情...)

elec2000 发表于 2018-11-3 15:27:59

本帖最后由 elec2000 于 2018-11-3 15:29 编辑

单片机程序中点灯是次要的,主要的是你其他的重要事情。
定时中断是你在干重要事情时,定时的被打断(10mS)去记录被打断多少次,,如果到了10次,则反转LED的状态;到了100次则确认1S时间到做一个 flag_1s = 1,同时count_timer2+1(一秒加1)。当count_timer2=10时,。。。。
而这个中断时间很短(与10mS比较),所以你有很多时间去干其他的重要事情。

laujc 发表于 2018-11-3 17:11:23

程序结构不对。
中断处理任务也是不太好的,除非任务非常短。

ali1019 发表于 2018-11-3 17:24:56

不要浪費主程序只去做等待動作, 需善用中斷, 也不要在中斷裡做太多事情.

时光黑白 发表于 2018-11-3 17:25:00

论坛上马潮老师的按键程序,了解一下

qiqirachel 发表于 2018-11-3 17:28:10

用freertos啊

yiminglei_2 发表于 2018-11-3 17:33:55

上RTOS不就可以了吗

资深雨粉 发表于 2018-11-3 17:43:33

laujc 发表于 2018-11-3 17:11
程序结构不对。
中断处理任务也是不太好的,除非任务非常短。

哪里不对呢,可不可以说一下,新手

资深雨粉 发表于 2018-11-3 17:45:03

qiqirachel 发表于 2018-11-3 17:28
用freertos啊

freetos是啥,原谅我是新手

appleboy 发表于 2018-11-3 18:46:38

就目前的情况看,OS还不适合你的阶段,用状态机吧

not_at_all 发表于 2018-11-3 18:52:08

没有人叫你一直等啊!搞个定时器中断,设一个标志位,时间没到跳过去,时间到了才执行。

adcr 发表于 2018-11-3 19:36:13

早上起来你烧水,你难道站在厨房里一下盯着它吗?

cht-rtos 发表于 2018-11-3 20:22:20

打一枪就转移阵地

Name_006 发表于 2018-11-3 20:58:09

新手吗建议新手不要学电子了,学不完的知识,可以考虑转大数据处理 这些互联网项目。虽然哪都有学不完的知识,但是相对新的东西工资高{:lol:}

lonely9391 发表于 2018-11-3 21:06:00

这些不是及时处理还是不要放在中断里吧,主函数处理多好

sunliezhi 发表于 2018-11-3 21:21:29

void Sys_10ms_Interrupt(void) //10ms中断函数
{
      static volatileu16 led_timer = 0;
      static volatileu16 count_timer = 0;
      static volatileu16 count_timer2 = 0;
      count_timer++;
      flag_1s = 0;                                     flag_1s这里每10ms就清零不对, 应该放到1秒任务中清零
      if(count_timer%100 == 0)      
      {      
                flag_1s = 1;          //1s定时

laujc 发表于 2018-11-3 21:40:51

资深雨粉 发表于 2018-11-3 17:43
哪里不对呢,可不可以说一下,新手

6L 说得比较正确

shawn_bu 发表于 2018-11-5 09:05:24

状态机适合你。

xstt 发表于 2018-11-5 09:39:52

中断只记录标识累加,然后到一定次数的中断后main那边处理相应的就可以了。
假设1秒一个中断
%3==0 就是3秒处理的事情
%10==0 就是10秒处理的事情了

cnshibo 发表于 2018-11-5 09:57:37

QPC framework 值得每个单片机工程师拥有。

sup888 发表于 2018-11-5 10:36:59

cnshibo 发表于 2018-11-5 09:57
QPC framework 值得每个单片机工程师拥有。



百度一下,是这个东西么?

cnshibo 发表于 2018-11-5 15:49:59

sup888 发表于 2018-11-5 10:36
百度一下,是这个东西么?

是的,就是这个东西。

yunqing_abc 发表于 2018-11-5 15:52:46

sup888 发表于 2018-11-5 10:36
百度一下,是这个东西么?

工作中已经用了这个状态机了。这是个好东西,但是书我是看不懂。

sup888 发表于 2018-11-5 16:09:26

yunqing_abc 发表于 2018-11-5 15:52
工作中已经用了这个状态机了。这是个好东西,但是书我是看不懂。

是不是把简单的东西写复杂了{:lol:} 。不太习惯这本书的排版{:sweat:}

yunqing_abc 发表于 2018-11-5 16:17:19

sup888 发表于 2018-11-5 16:09
是不是把简单的东西写复杂了 。不太习惯这本书的排版

对的,写的太恶心了。本来很简单的东西,搞那么复杂

qq335702318 发表于 2018-11-5 16:39:49

sup888 发表于 2018-11-5 10:36
百度一下,是这个东西么?

又是一份500+ page的资料
搞嵌入式的真心伤不起

最近稍微有丁点没有那么忙
就打算提高一下自己,比如玩玩RTOS/GUI
猛然发现
貌似想读懂RTOS代码,得熟悉ARM的汇编指令
了解汇编指令就要了解ARM体系
然后又发现C语言有很多用法之前都没用过,甚至没见过..
先放着,跳过去继续学习RTOS吧
又感觉想要用好RTOS必须有良好的编程思路
额,编程思维方面的资料也是有很多的,暂时看不过来
那就先做点啥 现学现用吧..
GUI是什么原理?
文件系统什么回事?
DMA..FMSC..FPU..?
{:mad:}

maimaige 发表于 2018-11-5 17:08:04

cnshibo 发表于 2018-11-5 09:57
QPC framework 值得每个单片机工程师拥有。

请问 这个QPC框架,你主要是用在哪些类型的项目中啊,我想找几个 简单的例子 实践一下

chenliangliang_ 发表于 2018-11-5 18:09:15

自己类比一下,吃饭的时候怎么同时呼吸

sup888 发表于 2018-11-5 18:31:35

qq335702318 发表于 2018-11-5 16:39
又是一份500+ page的资料
搞嵌入式的真心伤不起



用keil的rtx点个流水灯,还是很简单的事情{:lol:} 。个人觉得一般应用,拿来用就行了,没必要非得读懂每一行代码

wowangru 发表于 2018-11-5 19:32:42

这种问题 明显中断处理

cnshibo 发表于 2018-11-6 09:56:29

maimaige 发表于 2018-11-5 17:08
请问 这个QPC框架,你主要是用在哪些类型的项目中啊,我想找几个 简单的例子 实践一下...

一般单片机项目都可以用,stm32f030f4 的资源刚刚够用。stm8s003 ram/rom 少了点。

mikewang011 发表于 2018-11-6 10:01:20

一个硬件通用定时器+软件定时队列+状态机咯

资深雨粉 发表于 2018-11-6 11:10:10

mikewang011 发表于 2018-11-6 10:01
一个硬件通用定时器+软件定时队列+状态机咯

看不懂你写的这个。软件定时队列怎么弄

磊磊映画 发表于 2018-11-6 11:23:58

没必要用定时器实现,只用定时器做一个时基就行了 比如1ms记个时 变量++ ,主程序写成判断式的非阻塞   一直判断某个状态 多个状态

mikewang011 发表于 2018-11-6 13:51:31

资深雨粉 发表于 2018-11-6 11:10
看不懂你写的这个。软件定时队列怎么弄

硬件定时间实现 tick-tock, 基于tick-tock来写一个状态机(称为B吧)来管理软定时器队列。比如 tick tock 1ms, 你想要100ms的定时,那就向软件定时器队列注册一个100ms timer,同时绑定好回调函数,当你的状态机B发现队里中100ms的 timer timeout了,调用回调函数。可以参考 rtos的 timer实现。

cnshibo 发表于 2018-11-7 08:46:10

mikewang011 发表于 2018-11-6 13:51
硬件定时间实现 tick-tock, 基于tick-tock来写一个状态机(称为B吧)来管理软定时器队列。比如 tick toc ...

其实 任何一个 RTOS 或者 Framework 底层实现的原理都差不多,万变不离其宗:
systick 产生时基,timer fifo/queue/list里面存放 用户设置的(alarm)闹钟时间点。systick中断触发的时候去查询timer llist 里面的信息,如果节点已经超时,就触发 alarm。
进程、线程调度 的原理也差不多。剩下的就是处理中断开关(进程/线程互锁)等相关事务。

cysocool 发表于 2018-11-7 10:12:22

用中断,或者上操作系统啊{:lol:}

dou_yuyu 发表于 2018-11-7 16:09:45

个人认为,这类应用,最好是 ,做个标志位,中断里判断后写标志位。然后主程序来执行具体操作。当然你的任务真的非常需要立即执行,也可以写中断里。但是一般情况下,建议中断里代码越少越好。

diyeyuye 发表于 2018-11-19 09:46:26

资深雨粉 发表于 2018-11-6 11:10
看不懂你写的这个。软件定时队列怎么弄

找下安富莱教程了解一下,他们的历程都是使用软定时器的框架来写的,很好用。
页: [1]
查看完整版本: 单片机怎么在灯闪烁的同时去做另一件事情呢?