嵌入式软件有裸机的,也有操作系统的软件,我们写的功能肯定会出现有些变量是共用的,当多处修改这个变量的时候会出现,资源竞争问题,资源进行的现象如下:
对于下面的程序
在线程1,线程2,都会使用相同的变量ch, 这种情况如何处理??
/* 全局变量 ch*/
int ch = 'a';
/* 线程1, 使用资源全局变量ch */
void thread1_main()
{
ch = 'b'
}
/* 线程2, 使用资源全局变量ch */
void thread2_main()
{
ch = 'c'
}
/* 主程序 */
void main()
{
thread1_main();
thread2_main()
}
解决方法:
使用线程调度所,禁止在当前线程中修改共享资源变量的时候,os调度到其他线程!!
/* 全局变量 ch*/
int
ch
=
'a'
;
/* 线程1, 使用资源全局变量ch */
void
thread1_main
()
{
/* 对共享资源进行加上线程调度锁, 然后进行解锁 */
OSSchedLock
();
ch
=
'b'
OSSchedUnlock
();
}
/* 线程2, 使用资源全局变量ch */
void
thread2_main
()
{
/* 对共享资源进行加上线程调度锁, 然后进行解锁 */
OSSchedLock
();
ch
=
'c'
OSSchedUnlock
();
}
/* 主程序 */
void
main
()
{
thread1_main
();
thread2_main
()
}
2. 更复杂的情况
多个线程,和中断中都使用共同的资源ch ,我们该怎么办?
/* 全局变量 ch*/
int
ch
=
'a'
;
/* 线程1, 使用资源全局变量ch */
void
thread1_main
()
{
ch
=
'b'
}
/* 线程2, 使用资源全局变量ch */
void
thread2_main
()
{
ch
=
'c'
}
/* 中断服务程序 */
void
IRQ_handler
(
void
)
{
ch
=
'd'
}
/* 主程序 */
void
main
()
{
thread1_main
();
thread2_main
()
}
解决方法:
当线程和终端都修改这个变量的时候,由于中断的优先级大于线程,我们需要进行关中断的操作!!
/* 全局变量 ch*/
int
ch
=
'a'
;
/* 线程1, 使用资源全局变量ch */
void
thread1_main
()
{
/* 进行关闭中断的操作,防止*/
OS_ENTER_CRITICAL
();
ch
=
'b'
OS_EXIT_CRITICAL
();
}
/* 线程2, 使用资源全局变量ch */
void
thread2_main
()
{
OS_ENTER_CRITICAL
();
ch
=
'c'
OS_EXIT_CRITICAL
();
}
/* 中断服务程序 */
void
IRQ_handler
(
void
)
{
ch
=
'd'
}
/* 主程序 */
void
main
()
{
thread1_main
();
thread2_main
()
}