Zephyr -- Mutex
Mutex Zephyr Mutex有下面几个重要特性: lock count。该线程lock了mutux的次数。为0的时候表示unlock。 owning thread。 当一个线程拥有锁,其他线程在都在等待锁释放。一旦锁释放后,等待时间最长优先级最高的线程将被调度。 Zephyr中ISRs中不允许使用Mutex。 Reetrant Locking Zephyr Mutex是可重入锁,可多次加锁。 这样拥有锁的线程可以访问相关资源,不用管是否上锁。 可重入锁的目的就是防止死锁,导致同一个线程不可重入上锁代码段,目的就是让同一个线程可以重新进入上锁代码段。 Priority Inheritance 优先级继承。如果当前线程拥有锁,此时来了一个优先级更高的线程想获取锁,该线程会开始block等待。 此时系统会把拥有锁的线程优先级提高到和等待的线程相同,来尽快完成临界区的任务。一旦释放了锁,线程优先级又会调回去。 CONFIG_PRIORITY_CEILING用来配置最高提高到的优先级等级,默认为0为无限制。 Implementation Defining a Mutex struct k_mutex my_mutex; k_mutex_init(&my_mutex); //或 K_MUTEX_DEFINE(my_mutex); Locking a Mutex k_mutex_lock(&my_mutex, K_FOREVER); // 无限阻塞等待获取锁 if (k_mutex_lock(&my_mutex, K_MSEC(100)) == 0) { // 等待100ms,没获取到返回 /* mutex successfully locked */ } else { printf("Cannot lock XYZ display\n"); } Unlocking a Mutex k_mutex_unlock(&my_mutex); Futex Futex(fast userspace mutex)是比Mutex更轻量级的互斥访问原语。是一种用于用户空间应用程序的通用同步工具。 int k_futex_wait(struct k_futex *futex, int expected, k_timeout_t timeout) int k_futex_wake(struct k_futex *futex, bool wake_all) API Reference User Space Mutex API 把k_xxx前缀换成sys_xxx,比如sys_mutex_lock()。...