XFusion API v1.3.0
载入中...
搜索中...
未找到
examples/osal/thread/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#define XF_OSAL_CHECK(x) if (x != XF_OK)\
27{\
28 XF_LOGE(TAG, "xf check error: %d", x);\
29 xf_osal_thread_delete(NULL);\
30 return;\
31}
32
33/* ==================== [Typedefs] ========================================== */
34
35/* ==================== [Static Prototypes] ================================= */
36
37static void task1(void *argument);
38static void task2(void *argument);
39static void task3(void *argument);
40
41/* ==================== [Static Variables] ================================== */
42
43static xf_osal_thread_t thread[2] = {0};
44
45/* ==================== [Macros] ============================================ */
46
47/* ==================== [Global Functions] ================================== */
48
49void xf_main(void)
50{
51 xf_osal_thread_attr_t attr1 = {
52 .name = "task1",
53 .priority = XF_OSAL_PRIORITY_NORMOL,
54 .stack_size = 1024 * 2,
55 };
56 xf_osal_thread_attr_t attr2 = {
57 .name = "task2",
59 .stack_size = 1024 * 2,
60 };
61 xf_osal_thread_attr_t attr3 = {
62 .name = "task3",
64 .stack_size = 1024 * 2,
65 };
68 if (thread1 == NULL) {
69 XF_LOGE(TAG, "xf thread1 create error");
70 return;
71 }
72 thread[0] = xf_osal_thread_create(task2, NULL, &attr2);
73 if (thread[0] == NULL) {
74 XF_LOGE(TAG, "xf thread2 create error");
75 return;
76 }
77 thread[1] = xf_osal_thread_create(task3, NULL, &attr3);
78 if (thread[1] == NULL) {
79 XF_LOGE(TAG, "xf thread2 create error");
80 return;
81 }
83}
84
85/* ==================== [Static Functions] ================================== */
86
87static void task1(void *argument)
88{
89 (void)argument;
90 XF_LOGI(TAG, "task1 running");
92 const char *name = xf_osal_thread_get_name(task);
93 XF_LOGI(TAG, "thread name: %s", name);
95 XF_LOGI(TAG, "thread state: %d", state);
96 uint32_t stack_space = xf_osal_thread_get_stack_space(task);
97 XF_LOGI(TAG, "thread stack space: %d", stack_space);
99 if (err != XF_OK) {
100 XF_LOGE(TAG, "xf check error: %d", err);
101 }
103 XF_LOGI(TAG, "thread priority: %d", priority);
104
106
107 while (1) {
109 switch (state) {
110 case XF_OSAL_BLOCKED: {
112 } break;
113 case XF_OSAL_READY:
114 case XF_OSAL_RUNNING: {
115 XF_LOGI(TAG, "task1: task2 has resumed.");
116 goto l_end;
117 }
118 default: {
119 XF_LOGI(TAG, "task1: An error occurred while resuming task2.");
120 goto l_end;
121 } break;
122 }
124 }
125
126l_end:;
127 xf_osal_thread_delete(NULL); // 删除 task1
128}
129
130static void task2(void *argument)
131{
132 (void)argument;
133 uint32_t tick_count = 0;
134 uint32_t count = 0;
136 XF_LOGI(TAG, "task2 running");
137 while (1) {
138 tick_count = xf_osal_kernel_get_tick_count();
139 count = xf_osal_thread_get_count();
140 XF_LOGI(TAG, "task2 active count: %ld", count);
141 /*
142 从 get_tick_count() 时刻开始,绝对延迟到 1000 ms 后,
143 意味着 XF_LOGI() 的耗时也属于延迟的一部分。
144 */
145 tick_count += xf_osal_kernel_ms_to_ticks(1000);
147 }
148}
149
150static void task3(void *argument)
151{
152 (void)argument;
153 XF_LOGI(TAG, "task3 running");
154 while (1) {
155 XF_LOGI(TAG, "task3");
156 xf_osal_delay_ms(1000);
158 }
159}
void xf_main(void)
Definition xf_main.c:28
xf_err_t xf_osal_kernel_lock(void)
锁定 RTOS 内核调度程序。
xf_err_t xf_osal_kernel_unlock(void)
解锁 RTOS 内核调度程序。
uint32_t xf_osal_kernel_ms_to_ticks(uint32_t ms)
将 ms 数转为滴答数.
enum _xf_osal_state_t xf_osal_state_t
线程状态或内核状态。
uint32_t xf_osal_kernel_get_tick_count(void)
获取 RTOS 内核滴答计数。
@ XF_OSAL_READY
@ XF_OSAL_RUNNING
@ XF_OSAL_BLOCKED
uint32_t xf_osal_thread_get_stack_space(xf_osal_thread_t thread)
根据执行过程中的栈记录获取线程的可用堆栈空间。
xf_err_t xf_osal_thread_delete(xf_osal_thread_t thread)
终止线程的执行。
xf_osal_thread_t xf_osal_thread_get_current(void)
返回当前正在运行的线程的线程句柄。
const char * xf_osal_thread_get_name(xf_osal_thread_t thread)
获取线程的名称。
xf_osal_thread_t xf_osal_thread_create(xf_osal_thread_func_t func, void *argument, const xf_osal_thread_attr_t *attr)
创建一个线程并将其添加到活动线程中。
xf_err_t xf_osal_delay_until(uint32_t ticks)
(睡眠)等到指定时间刻度。
xf_err_t xf_osal_thread_suspend(xf_osal_thread_t thread)
暂停指定线程的执行,使其进入 BLOCKED 状态。
enum _xf_osal_priority_t xf_osal_priority_t
线程优先级。
uint32_t xf_osal_thread_get_count(void)
获取活动线程的数量。
xf_err_t xf_osal_thread_yield(void)
将控制权传递给处于状态 READY 的下一个线程。
void * xf_osal_thread_t
线程句柄。
xf_err_t xf_osal_delay_ms(uint32_t ms)
(睡眠)等待超时,以 ms 为单位。
xf_osal_state_t xf_osal_thread_get_state(xf_osal_thread_t thread)
获取线程的当前线程状态。
xf_err_t xf_osal_thread_resume(xf_osal_thread_t thread)
恢复线程的执行。
xf_osal_priority_t xf_osal_thread_get_priority(xf_osal_thread_t thread)
获取线程的当前优先级。
xf_err_t xf_osal_thread_set_priority(xf_osal_thread_t thread, xf_osal_priority_t priority)
更改线程的优先级。
@ XF_OSAL_PRIORITY_NORMOL
@ XF_OSAL_PRIORITY_BELOW_NORMAL
@ XF_OSAL_PRIORITY_HIGH
@ XF_OSAL_PRIORITY_ABOVE_NORMAL
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
#define XF_OSAL_CHECK(x)
Definition xf_main.c:26
static xf_osal_thread_t thread1
Definition xf_main.c:35
static xf_osal_thread_t thread[2]
Definition xf_main.c:43
static void task3(void *argument)
Definition xf_main.c:150
线程的属性结构。
static xf_task_t * task1
Definition xf_main.c:34
static void task(xf_task_t task)
Definition xf_main.c:45
#define XF_LOGI(tag, format,...)
#define XF_LOGE(tag, format,...)