回复本帖可获得 2 黑币奖励! 每人限 1 次
我想问一下,这里的
“从微观上看,单片机是没法在同一时刻做2件事情的!所以,每到10ms的时候,单片机会”先把1ms的事情做完再做10ms的事“;每到100ms的时候,单片机会”先把1ms的事情做完再做10ms的事,再做100ms的事”
是不是一个单片机一个默认的优先级吗?如果是这样,那么有些程序中“忙则等待”是不是为了避免1ms的事到10ms时还没做完,两件事同时做而让单片机死机吗?
希望楼主解答
“从微观上看,单片机是没法在同一时刻做2件事情的!所以,每到10ms的时候,单片机会”先把1ms的事情做完再做10ms的事“;每到100ms的时候,单片机会”先把1ms的事情做完再做10ms的事,再做100ms的事”
是不是一个单片机一个默认的优先级吗?如果是这样,那么有些程序中“忙则等待”是不是为了避免1ms的事到10ms时还没做完,两件事同时做而让单片机死机吗?
希望楼主解答
key_press_time是一个当某键被按下时,去数(第三声)数(第四声)的一个变量;
而这个变量所在的函数,是一个每1ms执行一次的函数,故而key_press_time每数一次数,按键就被持续按下了多少ms
没有你想的那么复杂,之所以是先做1ms的事在做10ms的事再做100ms的事,只是因为编写代码时,1ms的程序被放在了10ms的程序和100ms的程序的前面,你如果喜欢的话可以把100ms的程序放前面。
不同的功能函数可以单独定义一套自己的计时时基变量(通常是1ms)、调用标志、内部子步骤执行号(step)等等。其中把时基变量放进定时器里面累加或递减,一些你想要共享给外部调用数据可以定义成全局变量、方便独立调试排除问题。 以下是我常用的程序框架 (这里随便放了一段)
void Demon_B(void) {
if(lgRunTime_B< cTimes_B) return; //定时时间未到 return不往下执行。
{
lgRunTime_B = 0; //定时时间清0
if(FLAG_B& SET_Flow1){ //需要演示的标志立起?
if(cgStep_B==0){ //步骤0
//执行代码
cTimes_B = 10; //延时10ms
}else if(cgStep_B==1){ //步骤1
//执行代码
cTimes_B = 1000;//延时1000ms
} else{;}
if(++cgStep_B>5) cgStep_B = 0; //步骤号大于5
}}}
按照这样思路创建不同功能的ABCD函数(名字懒得取-_-),每个函数有自己的独立延时而不会引起干扰动作。执行步骤号中也可以塞入一些带返回值函数、其他功能的全局变量、标志什么的 if 判断一下,不符合就简单粗暴的return掉,前提是你自己的逻辑思路要清晰,原则上应尽量减少函数之间的耦合以提高效率。最后主调函中用 FLAG_B 标志调用或关闭它们,很方便灵活。
void Demon_B(void) {
if(lgRunTime_B< cTimes_B) return; //定时时间未到 return不往下执行。
{
lgRunTime_B = 0; //定时时间清0
if(FLAG_B& SET_Flow1){ //需要演示的标志立起?
if(cgStep_B==0){ //步骤0
//执行代码
cTimes_B = 10; //延时10ms
}else if(cgStep_B==1){ //步骤1
//执行代码
cTimes_B = 1000;//延时1000ms
} else{;}
if(++cgStep_B>5) cgStep_B = 0; //步骤号大于5
}}}
按照这样思路创建不同功能的ABCD函数(名字懒得取-_-),每个函数有自己的独立延时而不会引起干扰动作。执行步骤号中也可以塞入一些带返回值函数、其他功能的全局变量、标志什么的 if 判断一下,不符合就简单粗暴的return掉,前提是你自己的逻辑思路要清晰,原则上应尽量减少函数之间的耦合以提高效率。最后主调函中用 FLAG_B 标志调用或关闭它们,很方便灵活。
是防止它溢出,限制它只往上加,加到最大之后就不再增加
其实这个代码我一般不这么写的,这案例是我把我经常用的 宏函数 给展开了:
#define JINC(x) if(++x< = 0) --x //自增x,且不使其溢出
这样定义一个宏之后,以后凡是只想进行 “变量自增”操作又不想要变量溢出的时候,只要直接用这个宏就好啦。
例如本案例的源码其实是:
JINC(key_press_time);