跨度稍微大一点,现在我们来讨论一个关于共享资源的问题。例如在程序中定义了一个全局数组变量delaytimes[] 这个全局变量除了运行的任务可以访问,中断异常处理也可以访问,那么问题来了,任务1先对delaytimes[] 进行读操作,在任务1读的过程中Systick触发了任务切换,这个时候切换到了任务2,恰巧任务2对delaytimes[] 写操作,改变了delaytimes[]的一部分内容,当任务再切换回任务1的时候,接着读取delaytimes[] 中的内容,这样后面再读取的数据就不确定是否正确了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
好处:其他写共享资源的任务的操作不会影响到读任务读的数据吧,而且有情况能马上记录不会丢失。也不用当心临界保护嵌套使用。
缺点:资源需要较多,而且也怕切换时其他任务出现读处理资源任务(设计时需要注意,只有一处调用读处理函数的任务)。
方案二、可以把读处理共享资源的任务优先级设置成比写处理共享资源的任务的优先级高,这样只要读任务没有使用阻塞函数前,就不会先执行写共享资源,
优点:不用当心写共享资源的任务会抢占读共享资源的任务,能比较快的读取数据,资源占用较小,也不用当心临界保护嵌套使用。
缺点:写的共享资源可能会覆盖丢失,而且设计时需要注意优先级和阻塞,不能出现写任务比读任务优先级高,不能再读处理过程中出现阻塞(包括嵌套里)。
方案三、使用能在中断临界保护的函数(即能嵌套的临界保护函数,freertos有现成)
优点:设计简单不容易出现设计上的问题。
缺点:写的共享资源可能会覆盖丢失,频繁调用开关中断会影响RTOS中断的实时性(不知道会不会影响时序?)
最近刚刚学RTOS,上面有错的地方希望指出。
一周热门 更多>