1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 * Description: task
15 *
16 * Create: 2021-12-16
17 */
18
19 #include <los_task.h>
20 #include <los_base.h>
21 #include <los_tick.h>
22 #include <los_sched_pri.h>
23 #include <los_config.h>
24 #include <los_memory.h>
25 #include "soc_osal.h"
26 #include "osal_inner.h"
27
28 #define MINIMAL_STACK_SIZE LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE
29
osal_kthread_create(osal_kthread_handler handler,void * data,const char * name,unsigned int stack_size)30 osal_task *osal_kthread_create(osal_kthread_handler handler, void *data, const char *name, unsigned int stack_size)
31 {
32 if (handler == NULL) {
33 osal_log("parameter invalid!\n");
34 return NULL;
35 }
36
37 osal_task *task = (osal_task *)LOS_MemAlloc((void*)m_aucSysMem0, sizeof(osal_task));
38 if (task == NULL) {
39 osal_log("LOS_MemAlloc failed!\n");
40 return NULL;
41 }
42
43 TSK_INIT_PARAM_S my_task = { 0 };
44 my_task.pcName = (char *)name;
45 my_task.uwStackSize = (stack_size <= MINIMAL_STACK_SIZE) ? MINIMAL_STACK_SIZE : stack_size;
46 my_task.usTaskPrio = LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO;
47 my_task.uwResved = LOS_TASK_STATUS_DETACHED;
48 my_task.pfnTaskEntry = (TSK_ENTRY_FUNC)handler;
49
50 #ifdef HW_LITEOS_OPEN_VERSION_NUM
51 LOS_TASK_PARAM_INIT_ARG(my_task, data);
52 #else
53 my_task.auwArgs[0] = (AARCHPTR)data;
54 #endif
55
56 unsigned int temp_task_id = 0;
57 unsigned int ret = LOS_TaskCreate(&temp_task_id, &my_task);
58 if (ret != LOS_OK) {
59 LOS_MemFree((void*)m_aucSysMem0, (void*)task);
60 osal_log("LOS_TaskCreate failed! ret = %#x.\n", ret);
61 return NULL;
62 }
63 task->task = (void *)(UINTPTR)temp_task_id;
64 return task;
65 }
66
osal_kthread_set_priority(osal_task * task,unsigned int priority)67 int osal_kthread_set_priority(osal_task *task, unsigned int priority)
68 {
69 if (task == NULL) {
70 osal_log("parameter invalid!\n");
71 return OSAL_FAILURE;
72 }
73 unsigned int ret = LOS_TaskPriSet((unsigned int)(UINTPTR)task->task, priority);
74 if (ret != LOS_OK) {
75 osal_log("LOS_TaskPriSet failed! ret = %#x.\n", ret);
76 return OSAL_FAILURE;
77 }
78 return OSAL_SUCCESS;
79 }
80
osal_kthread_lock(void)81 void osal_kthread_lock(void)
82 {
83 LOS_TaskLock();
84 }
85
osal_kthread_unlock(void)86 void osal_kthread_unlock(void)
87 {
88 LOS_TaskUnlock();
89 }
90
osal_kthread_set_affinity(osal_task * task,int cpu_mask)91 void osal_kthread_set_affinity(osal_task *task, int cpu_mask)
92 {
93 osal_unused(task, cpu_mask);
94 return;
95 }
96
osal_kthread_should_stop(void)97 int osal_kthread_should_stop(void)
98 {
99 return 0;
100 }
101
osal_kthread_destroy(osal_task * task,unsigned int stop_flag)102 void osal_kthread_destroy(osal_task *task, unsigned int stop_flag)
103 {
104 unsigned int ret;
105 if (task == NULL) {
106 osal_log("parameter invalid!\n");
107 return;
108 }
109 unsigned int uwtask_id = (unsigned int)(UINTPTR)task->task;
110 LOS_MemFree((void*)m_aucSysMem0, (void*)task);
111 ret = LOS_TaskDelete(uwtask_id);
112 if (ret != LOS_OK && ret != LOS_ERRNO_TSK_NOT_CREATED) {
113 osal_log("LOS_TaskDelete failed! ret = %#x.\n", ret);
114 }
115 }
116
osal_schedule(void)117 void osal_schedule(void)
118 {
119 LOS_Schedule();
120 }
121
osal_kthread_suspend(osal_task * task)122 void osal_kthread_suspend(osal_task *task)
123 {
124 unsigned int ret;
125 if (task == NULL) {
126 osal_log("parameter invalid!\n");
127 return;
128 }
129
130 unsigned int uwtask_id = (unsigned int)(UINTPTR)task->task;
131 ret = LOS_TaskSuspend(uwtask_id);
132 if ((ret != LOS_OK) && (ret != LOS_ERRNO_TSK_ALREADY_SUSPENDED)) {
133 osal_log("LOS_TaskSuspend failed! ret = %#x.\n", ret);
134 return;
135 }
136 }
137
osal_kthread_resume(osal_task * task)138 void osal_kthread_resume(osal_task *task)
139 {
140 unsigned int ret;
141 if (task == NULL) {
142 osal_log("parameter invalid!\n");
143 return;
144 }
145
146 unsigned int uwtask_id = (unsigned int)(UINTPTR)task->task;
147 ret = LOS_TaskResume(uwtask_id);
148 if ((ret != LOS_OK) && (ret != LOS_ERRNO_TSK_NOT_SUSPENDED)) {
149 osal_log("LOS_TaskResume failed! ret = %#x.\n", ret);
150 return;
151 }
152 }
153
osal_kthread_schedule(unsigned int sleep_ns)154 void osal_kthread_schedule(unsigned int sleep_ns)
155 {
156 osal_unused(sleep_ns);
157 return;
158 }
159
osal_kthread_set_uninterrupt(void)160 void osal_kthread_set_uninterrupt(void)
161 {
162 return;
163 }
164
osal_kthread_set_running(void)165 void osal_kthread_set_running(void)
166 {
167 return;
168 }
169
osal_cond_resched(void)170 void osal_cond_resched(void)
171 {
172 return;
173 }
174
osal_yield(void)175 void osal_yield(void)
176 {
177 // linux/sched.h:#define cond_resched() do {} while (0)
178 return;
179 }
180
osal_kneon_begin(void)181 void osal_kneon_begin(void)
182 {
183 return;
184 }
185
osal_kneon_end(void)186 void osal_kneon_end(void)
187 {
188 return;
189 }
190
191 /* Description: get cur thread id */
osal_get_current_tid(void)192 long osal_get_current_tid(void)
193 {
194 unsigned int task_id = LOS_CurTaskIDGet();
195 if (task_id == LOS_ERRNO_TSK_ID_INVALID) {
196 osal_log("LOS_CurTaskIDGet failed!\n");
197 return OSAL_FAILURE;
198 }
199 return (long)task_id;
200 }
201
202 /* Description: get pid of cur thread id */
osal_get_current_pid(void)203 long osal_get_current_pid(void)
204 {
205 return osal_get_current_tid();
206 }
207
osal_msleep(unsigned int msecs)208 unsigned long osal_msleep(unsigned int msecs)
209 {
210 LOS_Msleep(msecs);
211 return 0;
212 }
213
osal_msleep_uninterruptible(unsigned int msecs)214 void osal_msleep_uninterruptible(unsigned int msecs)
215 {
216 LOS_Msleep(msecs);
217 }
218
osal_udelay(unsigned int usecs)219 void osal_udelay(unsigned int usecs)
220 {
221 LOS_Udelay(usecs);
222 }
223
osal_mdelay(unsigned int msecs)224 void osal_mdelay(unsigned int msecs)
225 {
226 LOS_Mdelay(msecs);
227 }
228