单片机怎么在灯闪烁的同时去做另一件事情呢?
程序中定时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;
}
}
直接是否等于100不好吗 这是中断函式,在主函式内做你的其他事情(另一件事情...) 本帖最后由 elec2000 于 2018-11-3 15:29 编辑
单片机程序中点灯是次要的,主要的是你其他的重要事情。
定时中断是你在干重要事情时,定时的被打断(10mS)去记录被打断多少次,,如果到了10次,则反转LED的状态;到了100次则确认1S时间到做一个 flag_1s = 1,同时count_timer2+1(一秒加1)。当count_timer2=10时,。。。。
而这个中断时间很短(与10mS比较),所以你有很多时间去干其他的重要事情。 程序结构不对。
中断处理任务也是不太好的,除非任务非常短。 不要浪費主程序只去做等待動作, 需善用中斷, 也不要在中斷裡做太多事情. 论坛上马潮老师的按键程序,了解一下 用freertos啊 上RTOS不就可以了吗 laujc 发表于 2018-11-3 17:11
程序结构不对。
中断处理任务也是不太好的,除非任务非常短。
哪里不对呢,可不可以说一下,新手 qiqirachel 发表于 2018-11-3 17:28
用freertos啊
freetos是啥,原谅我是新手 就目前的情况看,OS还不适合你的阶段,用状态机吧 没有人叫你一直等啊!搞个定时器中断,设一个标志位,时间没到跳过去,时间到了才执行。 早上起来你烧水,你难道站在厨房里一下盯着它吗? 打一枪就转移阵地 新手吗建议新手不要学电子了,学不完的知识,可以考虑转大数据处理 这些互联网项目。虽然哪都有学不完的知识,但是相对新的东西工资高{:lol:} 这些不是及时处理还是不要放在中断里吧,主函数处理多好 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定时 资深雨粉 发表于 2018-11-3 17:43
哪里不对呢,可不可以说一下,新手
6L 说得比较正确 状态机适合你。 中断只记录标识累加,然后到一定次数的中断后main那边处理相应的就可以了。
假设1秒一个中断
%3==0 就是3秒处理的事情
%10==0 就是10秒处理的事情了 QPC framework 值得每个单片机工程师拥有。 cnshibo 发表于 2018-11-5 09:57
QPC framework 值得每个单片机工程师拥有。
百度一下,是这个东西么? sup888 发表于 2018-11-5 10:36
百度一下,是这个东西么?
是的,就是这个东西。
sup888 发表于 2018-11-5 10:36
百度一下,是这个东西么?
工作中已经用了这个状态机了。这是个好东西,但是书我是看不懂。 yunqing_abc 发表于 2018-11-5 15:52
工作中已经用了这个状态机了。这是个好东西,但是书我是看不懂。
是不是把简单的东西写复杂了{:lol:} 。不太习惯这本书的排版{:sweat:} sup888 发表于 2018-11-5 16:09
是不是把简单的东西写复杂了 。不太习惯这本书的排版
对的,写的太恶心了。本来很简单的东西,搞那么复杂 sup888 发表于 2018-11-5 10:36
百度一下,是这个东西么?
又是一份500+ page的资料
搞嵌入式的真心伤不起
最近稍微有丁点没有那么忙
就打算提高一下自己,比如玩玩RTOS/GUI
猛然发现
貌似想读懂RTOS代码,得熟悉ARM的汇编指令
了解汇编指令就要了解ARM体系
然后又发现C语言有很多用法之前都没用过,甚至没见过..
先放着,跳过去继续学习RTOS吧
又感觉想要用好RTOS必须有良好的编程思路
额,编程思维方面的资料也是有很多的,暂时看不过来
那就先做点啥 现学现用吧..
GUI是什么原理?
文件系统什么回事?
DMA..FMSC..FPU..?
{:mad:} cnshibo 发表于 2018-11-5 09:57
QPC framework 值得每个单片机工程师拥有。
请问 这个QPC框架,你主要是用在哪些类型的项目中啊,我想找几个 简单的例子 实践一下 自己类比一下,吃饭的时候怎么同时呼吸 qq335702318 发表于 2018-11-5 16:39
又是一份500+ page的资料
搞嵌入式的真心伤不起
用keil的rtx点个流水灯,还是很简单的事情{:lol:} 。个人觉得一般应用,拿来用就行了,没必要非得读懂每一行代码 这种问题 明显中断处理 maimaige 发表于 2018-11-5 17:08
请问 这个QPC框架,你主要是用在哪些类型的项目中啊,我想找几个 简单的例子 实践一下...
一般单片机项目都可以用,stm32f030f4 的资源刚刚够用。stm8s003 ram/rom 少了点。 一个硬件通用定时器+软件定时队列+状态机咯 mikewang011 发表于 2018-11-6 10:01
一个硬件通用定时器+软件定时队列+状态机咯
看不懂你写的这个。软件定时队列怎么弄 没必要用定时器实现,只用定时器做一个时基就行了 比如1ms记个时 变量++ ,主程序写成判断式的非阻塞 一直判断某个状态 多个状态 资深雨粉 发表于 2018-11-6 11:10
看不懂你写的这个。软件定时队列怎么弄
硬件定时间实现 tick-tock, 基于tick-tock来写一个状态机(称为B吧)来管理软定时器队列。比如 tick tock 1ms, 你想要100ms的定时,那就向软件定时器队列注册一个100ms timer,同时绑定好回调函数,当你的状态机B发现队里中100ms的 timer timeout了,调用回调函数。可以参考 rtos的 timer实现。 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。
进程、线程调度 的原理也差不多。剩下的就是处理中断开关(进程/线程互锁)等相关事务。 用中断,或者上操作系统啊{:lol:} 个人认为,这类应用,最好是 ,做个标志位,中断里判断后写标志位。然后主程序来执行具体操作。当然你的任务真的非常需要立即执行,也可以写中断里。但是一般情况下,建议中断里代码越少越好。 资深雨粉 发表于 2018-11-6 11:10
看不懂你写的这个。软件定时队列怎么弄
找下安富莱教程了解一下,他们的历程都是使用软定时器的框架来写的,很好用。
页:
[1]