SIEMENS吉林省白城市 西门子代理商——西门子东北总代理
| 更新时间 2024-11-17 07:00:00 价格 请来电询价 西门子总代理 PLC 西门子一级代 驱动 西门子代理商 伺服电机 联系电话 15903418770 联系手机 15915421161 联系人 张经理 立即询价 |
我们来做一个互斥量的测试。互斥量主要是用来保护某个“资源”的独占性访问。当有多个线程要同时访问同一个内存区域或是硬件的时候,就需要这样的功能。我们设计了一个场景来测试互斥量。除了main函数所在的主线程外,我们再创建两个线程,分别负责板子上LED2和LED3的闪烁。同时,主线程也会让LED2和LED3以比较慢的速度来闪烁。以此,我们创造了一个多线程同时“争抢”LED2和LED3资源的状态。然后,通过互斥量的操作让LED2和LED3有序地快闪和慢闪。
为了实现以上目标,我们首先需要考虑一些全局性的定义,比如要创建的线程优先级、栈的大小、线程工作的时间片个数。另外,访问互斥量需要通过“句柄”的方式,就是一个指向互斥量的一个指针。为了所有线程都能访问到,我们一般采用全局变量的方式来定义这个指针。这部分代码在“mutexTest.c”文件的开头就能看到,如下图:
mutexTest.c文件开头的全局性定义
然后需要创建两个线程。在创建线程的同时也创建两个互斥量分别用来保护LED2和LED3的操作。我们把这些工作放在一个函数中实现,命名为“mutexThreadCreate()”,如下图。该函数首先调用RTT系统API函数,分别创建了两个名为“led2Mutex”和“led3Mutex”的互斥量。然后分别创建并启动了两个名为“led2MutexThread”和 “led3MutexThread”的线程。注意互斥量和线程创建的顺序,因为我们的线程创建完毕后就调用RTT的API函数“rt_thread_startup()”启动它们了,所以在启动前必须先把线程需要用到的东西先定义和创建好。
mutexThreadCreate()函数的实现
“mutexThreadCreate()”在主函数中被调用,如下图。
mutexThreadCreate()函数在主函数中被调用
接下来我们先看主函数对LED2和LED3的操作。为了提高程序独立性和可阅读性,我们没有直接在主函数的循环体内码代码,而是在“mutexTest.c”文件中又创建了一个“mainMutexTest()”函数,如下图。在主函数的循环体内不断调用这个函数,来实现主线程对LED的操作。