问:
在stm32裸机程序中,举个简单的例子,比如主循环有三个函数,一个是处理LCD显示,一个是无线通信,一个是按键处理。如果无线通讯程序中需要delay十几秒,那LCD显示就会有问题,而且按键检测也会不灵,说这个例子主要就是想说delay暂用cpu不释放,或者用定时器来延时时,这个cpu控制问题,使得顺序处理几个任务时对那些实时响应的要求高的任务就得不到效果,如果用操作系统的话肯定没有这个问题,因为delay的时候,任务是把cpu使用权释放掉的,不用操作系统的话,这个问题怎么解决,谁能提供下经验或者方法?
答:
事件驱动 + 状态机处理 + 按键部分(扫描或者中断) 不用上操作系统也能完成
专业的说法: 非阻塞方式的软件设计
具体设计方法: 事件驱动+状态机处理.
说得更明白一些: delay 改成定时器触发事件.
例子:
很想给你个例程,不过这只是个编程方法和解题思路.
呵呵, 举个最简单的例吧, 下面是个定时中断函数, 给软定时器 Timer 计时.
void timer(void) {
int x=sizeof(Timer);
do
if(Timer[--x]) Timer[x]--; // 软定时器计时
while (x>=0);
}
然后是
main(){
...
if (Timer[0] ==0) { // 定时结束
LcdDisplay();
Timer[0] = LCD_TIMER;
}
..... // 其他的任务类似
}
以上是我在网上找到跟我类似的问题,我现在也是需要执行几个函数
这是我的main函数
[mw_shl_code=c,true]RCC_Configuration();
Init_Config();
SysTick_Init();
LED1(ON);
while(1)
{
count = TIM3->CNT;//获取计数值
num = count/4;//倍频4,除以4得到正确的脉冲数
Control(num);
if(Uart1_rev_flag == 0x01)
{
Uart1_rev_flag = 0x00;//接收一帧数据标志清零
ParseRecieve();//数据帧处理函数
GPIO_ResetBits(GPIOA,GPIO_Pin_0);//485接收使能,关闭发送使能
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//允许接收中断
}
}
}[/mw_shl_code]
1. 不停的读取TIM3->CNT,根据得到的数值控制GPIO引脚信号,即执行Control(num)
2.同时我需要进行485通信将读取到的num值传给触摸屏,让其在触摸屏上动态显示
现在的问题就是我的通信影响了我的Control(num)函数,要去除这种影响该怎么做?
如何不停的读取TIM3->CNT然后进行处理能跟通信不干扰?上面是我在网上看到别人的问题,跟我的类似,但是我没理解
事件驱动 + 状态机处理 + 按键部分(扫描或者中断) 不用上操作系统也能完成
专业的说法: 非阻塞方式的软件设计
具体设计方法: 事件驱动+状态机处理.
说得更明白一些: delay 改成定时器触发事件.
这个思想?
还有下面这个代码,是怎么实现相互不干扰的?
[mw_shl_code=c,true]很想给你个例程,不过这只是个编程方法和解题思路.
呵呵, 举个最简单的例吧, 下面是个定时中断函数, 给软定时器 Timer 计时.
void timer(void) {
int x=sizeof(Timer);
do
if(Timer[--x]) Timer[x]--; // 软定时器计时
while (x>=0);
}
然后是
main(){
...
if (Timer[0] ==0) { // 定时结束
LcdDisplay();
Timer[0] = LCD_TIMER;
}
..... // 其他的任务类似
}[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
11.4号有。
一周热门 更多>