临界区保护

2020-03-01 11:56发布

跨度稍微大一点,现在我们来讨论一个关于共享资源的问题。例如在程序中定义了一个全局数组变量delaytimes[] 这个全局变量除了运行的任务可以访问,中断异常处理也可以访问,那么问题来了,任务1先对delaytimes[] 进行读操作,在任务1读的过程中Systick触发了任务切换,这个时候切换到了任务2,恰巧任务2delaytimes[] 写操作,改变了delaytimes[]的一部分内容,当任务再切换回任务1的时候,接着读取delaytimes[] 中的内容,这样后面再读取的数据就不确定是否正确了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
玛尼玛尼哄
1楼-- · 2020-03-02 10:58
跑系统的?
caoenq
2楼-- · 2020-03-02 12:49
 精彩回答 2  元偷偷看……
dingbo95
3楼-- · 2020-03-02 13:03
caoenq 发表于 2019-6-24 16:41
解决共享资源问题,往往不推荐使用进入临界区的方式,优先使用资源的守护任务方式,或者挂起调度器的方式。 ...

是的,不着急后面一步一步来
dingbo95
4楼-- · 2020-03-02 16:18
玛尼玛尼哄 发表于 2019-6-22 21:40
跑系统的?

是啊,rtos
15859892563
5楼-- · 2020-03-02 16:58
方案一、既然共享资源作成数组了,可以用改用队列吗?
                        好处:其他写共享资源的任务的操作不会影响到读任务读的数据吧,而且有情况能马上记录不会丢失。也不用当心临界保护嵌套使用。
                        缺点:资源需要较多,而且也怕切换时其他任务出现读处理资源任务(设计时需要注意,只有一处调用读处理函数的任务)。                       
方案二、可以把读处理共享资源的任务优先级设置成比写处理共享资源的任务的优先级高,这样只要读任务没有使用阻塞函数前,就不会先执行写共享资源,
                        优点:不用当心写共享资源的任务会抢占读共享资源的任务,能比较快的读取数据,资源占用较小,也不用当心临界保护嵌套使用。
                        缺点:写的共享资源可能会覆盖丢失,而且设计时需要注意优先级和阻塞,不能出现写任务比读任务优先级高,不能再读处理过程中出现阻塞(包括嵌套里)。
方案三、使用能在中断临界保护的函数(即能嵌套的临界保护函数,freertos有现成)
                        优点:设计简单不容易出现设计上的问题。
                        缺点:写的共享资源可能会覆盖丢失,频繁调用开关中断会影响RTOS中断的实时性(不知道会不会影响时序?)
最近刚刚学RTOS,上面有错的地方希望指出。

一周热门 更多>