让我们看一下这个程序:上面的程序是串行端口2的中断服务功能。
数据。
这样,该程序得到了很好的保护,并且在执行接收过程期间不会因中断而中断串行端口。
但是,如果您不注意,就会感到沮丧。
让我们看一下以下情况。
如果使用stm32cubeMX生成代码,我们将看到在main.c中调用了串行端口初始化函数,并且在由代码编写规则定义的区域中定义了信号灯以处理传感器数据。
编程思想似乎没有错,但是灾难将要发生,因此我们将这样的段落添加到msp初始化函数中。
如果在初始化串行端口后传感器设备未通过串行端口发送数据,则在未触发串行端口接收中断的情况下,幸运的是您的设备可以开机并正常运行。
如果在初始化串行端口后传感器立即向MCU报告数据,您会突然发现设备无法开启?什么?为什么是这样?断点调试后发现问题。
我们在这里发送了一个信号量,但是该信号量尚未初始化,对吗? ?让我们跟踪断点,输入函数xSemaphoreGiveFromISR,看看它为什么卡住了?这是一个宏,实际上调用了函数xQueueGiveFromISR。
我们继续跟踪断点。
让我们逐步通过以下断言:事实证明我们已经死在这里,这意味着我们没有创建队列句柄。
这是stm32cubeMX给我们带来的欺诈问题。
有必要根据其要求定义和编写代码,同时也要防止此类问题的发生。
如何解决这个问题呢?其实,这很简单,只需添加一个标志变量即可。
在操作系统启动之前,我们不会让发送信号量的语句执行。
操作系统启动后,让发送信号量的语句执行,否则会带来灾难性后果。
在操作系统启动之前,我们尚未使用数据,并且尚未创建信号灯。
目前,不要使用os的信号量发送和接收功能,因此我想到了定义is_use_os变量的解决方案。
在此标志为假之前,当os处于运行状态时,此标志为true。
在中断服务函数中判断该标志:这样,在启动os之前,is_use_os变量为false,并且不执行相应的代码。
当os启动时,is_use_of变量为true。
让我们看一下os启动,这个变量还是NULL吗?让代码运行到初始化任务中,这也标志着操作系统已经启动。
然后将断点放在刚接收到串行端口中断的函数中。
然后走进去看看。
这时,我们发现此值不再为NULL。
完美解决问题。
上一期关于微控制器的精彩节目的连胜程序的框架。
C语言将xxx.bin文件转换为数组和指针的数组。
这是一个非常发人深省的笔试题。
简单易用的事件驱动的密钥驱动程序模块。
如果您认为这次共享的文章对您有所帮助,请单击[查找]并转发并共享,这也是我的支持。