都是说临界区的代码是不能被打断的,或者反过来说,如果某段程序不能或者不应该被打断,就应该使用临界区
例如:
1>我看原子和很多其它的例程,OSTaskCreate(...)被放在临界区内,但是我觉得没必要啊,因为OSTaskCreate(...)源码中的关键代码段已经被放在临界区了...
2>下面这段代码需要在哪个地方进入临界区嘛?为什么?
[mw_shl_code=c,true]void lwip_reset_thread(void *p_arg)
{
struct lwip_info info;
p_arg = p_arg;
Reset_GPIO_Init();
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
{
OSTimeDlyHMSM(0, 0, 5, 0);
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
{
info.server_ip.addr = 0x3d0aa8c0UL; //default server ip:192.168.10.61
info.local_ip.addr = 0xde0aa8c0UL; //default local ip :192.168.10.222
info.netmask.addr = 0x00ffffffUL; //default netmask :255.255.255.0
info.gateway.addr = 0x010aa8c0UL; //default gateway :192.168.10.1
info.port = 0x1f90; //default port :8080
info.dhcp = 0; //default dhcp :0
fatfs_write(file, &info); //将上面这个结构体数据通过fatfs写入flash当中
OSSemPost(sem_others);
OSSemPost(sem_serverip);
}
}
OSTimeDlyHMSM(0, 0, 1, 0);
}
}[/mw_shl_code]
那么关键的问题来了~~~
如何判断某段代码是不可被打断的(需要进入临界区),恳请大神能够讲的清楚,细致点,小弟在此拜谢大神指教~~~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
其实需要不需要临界访问,可以这样分析:
1.代码中是否有使用全局资源.你上面的代码就用了两个全局资源,一是GPIO,一是文件指针.
2.在本线程使用的资源,如果被其他线程改变,会对结果造成什么样的影响.你的代码中,GPIO的状态改变正是你需要的,但如果文件指针被其他线程改变,那可能就会影响结果.
3.设想其他线程可能在任何时候抢占本线程,在最坏情况下的线程切换并且全局门资源被改变,是否会对结果造成影响.你的代码,如果在写文件过程中,只写了2个字节就被打断,切换到其他线程,往文件写了10字节,再切换回来,那你剩余的数据再写到文件中.那很显然,你的数据就被打乱了.
一周热门 更多>