碰到一个问题, 就是要100%保证串口接收不丢数。由于stm32的串口接收只有1个byte的buffer, 那么当数据来了后进入中断服务程序,如果要处理这个数据,可能要花比较长的时间,那么在处理的时候来了一个新的数据,就会丢掉。[这个论述是否正确?]
好吧,那就做一个类似fifo的东西,串口来了数,进入中断服务程序,做简单的事情,就是把来的数丢进fifo里, 这样中断服务程序比较快,而数据的处理则交给另外的地方。
如果把数据处理程序放在main()循环中, 看起来是个不错的选择, 但是我认为有风险,就是当main()里在读取fifo的数据的时候,会操作一些与fifo有关的指针, 而此时如果又来数了,进入中断服务程序,那么中断服务程序在向fifo里扔数的时候,也会操作fifo有关的指针,这样一个还没处理完,另一个就插了进来,导致fifo的逻辑完全混乱了[该论述是否正确?]。
我想到的一个处理方法,是把处理数据的程序放在定时中断中,这样向fifo里扔数和从fifo里读书的程序都在中断中,把这两个中断设置成相同的优先级,就不会互相干扰,类似于windows里的CritialSection[该方法是否正确?]。
但是感觉这个方法不是太好,谁有简单的办法吗?
另外如果用ucos-ii, 可能需要使用CRITICAL_SECTION, 也就是在从fifo读数时要关掉中断,这样是否也可能丢数? |