XFusion API v1.3.0
载入中...
搜索中...
未找到
examples/osal/mutex/main/xf_main.c

xf_osal 互斥锁示例。

1
17/* ==================== [Includes] ========================================== */
18
19#include "xf_hal.h"
20#include "xf_osal.h"
21
22/* ==================== [Defines] =========================================== */
23
24#define TAG "main"
25
26/* ==================== [Typedefs] ========================================== */
27
28/* ==================== [Static Prototypes] ================================= */
29
30static void task1(void *argument);
31static void task2(void *argument);
32
33/* ==================== [Static Variables] ================================== */
34
35static xf_osal_mutex_t mutex = NULL;
36static int shared_resource = 0;
37
38/* ==================== [Macros] ============================================ */
39
40/* ==================== [Global Functions] ================================== */
41
42void xf_main(void)
43{
44 xf_osal_mutex_attr_t mutex_attr = {
45 .name = "mutex",
46 };
47 xf_osal_thread_attr_t attr1 = {
48 .name = "task1",
49 .priority = XF_OSAL_PRIORITY_NORMOL,
50 .stack_size = 1024 * 2,
51 };
52 xf_osal_thread_attr_t attr2 = {
53 .name = "task2",
55 .stack_size = 1024 * 2,
56 };
57
58 mutex = xf_osal_mutex_create(&mutex_attr);
59 if (mutex == NULL) {
60 XF_LOGE(TAG, "xf mutex create error");
61 return;
62 }
63
64 xf_osal_mutex_t mutex2 = xf_osal_mutex_create(&mutex_attr);
65 if (mutex2 == NULL) {
66 XF_LOGE(TAG, "xf mutex2 create error");
67 return;
68 }
69
70 xf_err_t err = xf_osal_mutex_delete(mutex2);
71 if (err != XF_OK) {
72 XF_LOGE(TAG, "xf mutex2 delete error");
73 return;
74 }
75
77 if (thread1 == NULL) {
78 XF_LOGE(TAG, "xf thread1 create error");
79 return;
80 }
81
83 if (thread2 == NULL) {
84 XF_LOGE(TAG, "xf thread2 create error");
85 return;
86 }
87}
88
89/* ==================== [Static Functions] ================================== */
90
91static void task1(void *argument)
92{
93 XF_LOGI(TAG, "%s:%p", __func__, xf_osal_thread_get_current());
94 while (1) {
95 if (xf_osal_mutex_acquire(mutex, 100) == XF_OK) {
96 XF_LOGI(TAG, "Task1: Accessing shared resource...");
98 XF_LOGI(TAG, "Task1: Shared resource value: %d\n", shared_resource);
100 xf_osal_delay_ms(800);
101 } else {
102 XF_LOGI(TAG, "Task1: Acquire mutex timeout");
104 XF_LOGI(TAG, "Task1: Mutex owner: %p", thread);
105 }
106 }
107}
108
109static void task2(void *argument)
110{
111 XF_LOGI(TAG, "%s:%p", __func__, xf_osal_thread_get_current());
112 while (1) {
114 XF_LOGI(TAG, "Task2: Accessing shared resource...");
116 XF_LOGI(TAG, "Task1: Shared resource value: %d\n", shared_resource);
117 xf_osal_delay_ms(1000);
119 }
120 }
121}
void xf_main(void)
Definition xf_main.c:28
void * xf_osal_mutex_t
互斥锁句柄。
xf_err_t xf_osal_mutex_release(xf_osal_mutex_t mutex)
释放互斥锁。
xf_osal_thread_t xf_osal_mutex_get_owner(xf_osal_mutex_t mutex)
获取互斥锁持有者线程句柄。
xf_err_t xf_osal_mutex_acquire(xf_osal_mutex_t mutex, uint32_t timeout)
获取互斥锁。
xf_osal_mutex_t xf_osal_mutex_create(const xf_osal_mutex_attr_t *attr)
创建并初始化互斥锁。
xf_err_t xf_osal_mutex_delete(xf_osal_mutex_t mutex)
删除互斥锁。
xf_osal_thread_t xf_osal_thread_get_current(void)
返回当前正在运行的线程的线程句柄。
xf_osal_thread_t xf_osal_thread_create(xf_osal_thread_func_t func, void *argument, const xf_osal_thread_attr_t *attr)
创建一个线程并将其添加到活动线程中。
void * xf_osal_thread_t
线程句柄。
xf_err_t xf_osal_delay_ms(uint32_t ms)
(睡眠)等待超时,以 ms 为单位。
@ XF_OSAL_PRIORITY_NORMOL
@ XF_OSAL_PRIORITY_ABOVE_NORMAL
#define XF_OSAL_WAIT_FOREVER
Definition xf_osal_def.h:30
int32_t xf_err_t
整形错误类型。 错误码具体值见 xf_err_code_t.
Definition xf_err.h:69
@ XF_OK
Definition xf_err.h:43
static void task2(void *argument)
Definition xf_main.c:104
#define TAG
Definition xf_main.c:24
static int shared_resource
Definition xf_main.c:36
static xf_osal_mutex_t mutex
Definition xf_main.c:35
static xf_osal_thread_t thread1
Definition xf_main.c:35
static xf_osal_thread_t thread2
Definition xf_main.c:36
static xf_osal_thread_t thread[2]
Definition xf_main.c:43
互斥锁的属性结构。
线程的属性结构。
static xf_task_t * task1
Definition xf_main.c:34
#define XF_LOGI(tag, format,...)
#define XF_LOGE(tag, format,...)