我们来做一个互斥量的测试。互斥量主要是用来保护某个“资源”的独占性访问。当有多个线程要同时访问同一个内存区域或是硬件的时候,就需要这样的功能。我们设计了一个场景来测试互斥量。除了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的操作。
- 工业人工智能驱动的流程工业智能制造 2024-11-26
- 科学挑战与关键技术 2024-11-26
- 认知科学的兴起 2024-11-26
- 认知科学的研究内容 2024-11-26
- 40个变频器常见问题,收藏熟记还有啥搞不定的故障 2024-11-26
- 失速防止功能是什么意思? 2024-11-26
- 为什么不能在6-60Hz全区域连续运转使用? 2024-11-26
- 计算机控制系统采用的技术和发展趋势(一) 2024-11-26
- 自适应控制 2024-11-26
- 人工智能 2024-11-26
- 智能控制的产生 2024-11-26
- 智能控制的特点 2024-11-26
- 不确定性原理 2024-11-26
- DCS和PLC争了40年,知道Zui大的区别在哪里吗? 2024-11-26
- PLC和DCS工程性分析比较 2024-11-26