互斥量
void th1_entry(void *parameter)
{
while(1)
{
rt_mutex_take(mutex1_ptr, RT_WAITING_FOREVER);
flag1++;
rt_thread_mdelay(1000);
flag2++;
rt_mutex_release(mutex1_ptr);
}
}
void th2_entry(void *parameter)
{
while(1)
{
rt_mutex_take(mutex1_ptr, RT_WAITING_FOREVER);
flag1++;
flag2++;
rt_mutex_release(mutex1_ptr);
rt_kprintf("flag1:%d, flag2:%d\n",flag1,flag2);
rt_thread_mdelay(1000);
}
}
添加互斥锁能够保证输出打印结果时候 flag1 与flag2 的数值相同
事件集
一个事件集对象可同时等待接受32个事件 ,并且通过 逻辑与 和逻辑或来选择如何激活线程 。
- 逻辑与: 假如你设置了4个事件 , 那么这四个事件都触发才可以。
- 逻辑或: 则表示只需要任意一个便可以
#define EVENT_FLAG_1 (0x1 <<0)
#define EVENT_FLAG_2 (0x1 <<1)
#define EVENT_FLAG_3 (0x1 <<2)
void th1_entry(void *parameter)
{
while(1)
{ rt_event_recv(event1_ptr, EVENT_FLAG_1, RT_EVENT_FLAG_CLEAR|RT_EVENT_FLAG_AND, RT_WAITING_FOREVER, NULL);
rt_kprintf("th1 is running\n");
rt_event_send(event1_ptr,EVENT_FLAG_2 );
rt_thread_mdelay(1000);
}
}
void th2_entry(void *parameter)
{
while(1)
{ rt_event_recv(event1_ptr, EVENT_FLAG_2, RT_EVENT_FLAG_CLEAR|RT_EVENT_FLAG_AND, RT_WAITING_FOREVER, NULL);
rt_kprintf("th2 is running\n");
rt_event_send(event1_ptr,EVENT_FLAG_3 );
rt_thread_mdelay(1000);
}
}
void th3_entry(void *parameter)
{
while(1)
{ rt_event_recv(event1_ptr, EVENT_FLAG_3, RT_EVENT_FLAG_CLEAR|RT_EVENT_FLAG_AND, RT_WAITING_FOREVER, NULL);
rt_kprintf("th3 is running\n");
rt_event_send(event1_ptr,EVENT_FLAG_1 );
rt_thread_mdelay(1000);
}
}
int main(void)
{
...
//首先发送事件1 这样才能够进入线程1 触发线程2 进而触发线程3
rt_event_send(event1_ptr, EVENT_FLAG_1);
}