1 #include "mpsalport.h"
2 
3 #include "aos/kernel.h"
4 #include "k_api.h"
5 #include "py/mperrno.h"
6 #include "ulog/ulog.h"
7 
8 #define LOG_TAG "mp_sal_port"
9 
mp_sal_get_stack_size()10 mp_uint_t mp_sal_get_stack_size()
11 {
12     ktask_t *task = krhino_cur_task_get();
13     return task->stack_size;
14 }
15 
mp_sal_get_stack_addr()16 void *mp_sal_get_stack_addr()
17 {
18     ktask_t *task = krhino_cur_task_get();
19     return (void *)(task->task_stack_base);
20 }
21 
mp_sal_task_delete(aos_task_t * id,mp_int_t * status)22 void mp_sal_task_delete(aos_task_t *id, mp_int_t *status)
23 {
24     *status = aos_task_delete(id);
25 }
26 
mp_sal_mutex_create(mp_sal_mutex_obj_t * mutex)27 mp_int_t mp_sal_mutex_create(mp_sal_mutex_obj_t *mutex)
28 {
29 #ifndef AOS_BOARD_HAAS700
30     int status = aos_mutex_create(mutex, 0);
31 #else
32     int status = aos_mutex_new((aos_mutex_t *)mutex);
33 #endif
34     return status;
35 }
36 
mp_sal_mutex_lock(mp_sal_mutex_obj_t * mutex,mp_uint_t timeout)37 mp_int_t mp_sal_mutex_lock(mp_sal_mutex_obj_t *mutex, mp_uint_t timeout)
38 {
39     if (mutex == NULL) {
40         LOGE(LOG_TAG, "mpthread mutex lock with mutex NULL !!");
41         return -MP_EINVAL;
42     }
43 
44     if (timeout == 0) {
45         return 0;
46     }
47     int status = aos_mutex_lock(mutex, timeout);
48     return status;
49 }
50 
mp_sal_mutex_unlock(mp_sal_mutex_obj_t * mutex)51 mp_int_t mp_sal_mutex_unlock(mp_sal_mutex_obj_t *mutex)
52 {
53     if (mutex == NULL) {
54         LOGE(LOG_TAG, "mpthread mutex unlock with mutex NULL !!");
55         return -MP_EINVAL;
56     }
57     int status = aos_mutex_unlock(mutex);
58     return status;
59 }
60 
mp_sal_mutex_delete(mp_sal_mutex_obj_t * mutex)61 void mp_sal_mutex_delete(mp_sal_mutex_obj_t *mutex)
62 {
63     aos_mutex_free(mutex);
64 }
65 
66 /* APIs for semphone */
67 
mp_sal_sem_create(mp_sal_sem_obj_t * sem)68 mp_int_t mp_sal_sem_create(mp_sal_sem_obj_t *sem)
69 {
70     int status = aos_sem_create(sem, 0, 0);
71     return status;
72 }
73 
mp_sal_sem_take(mp_sal_sem_obj_t * sem,mp_uint_t timeout)74 mp_int_t mp_sal_sem_take(mp_sal_sem_obj_t *sem, mp_uint_t timeout)
75 {
76     if (sem == NULL) {
77         LOGE(LOG_TAG, "mpthread sem lock with sem NULL !!");
78         return -MP_EINVAL;
79     }
80 
81     if (timeout == 0) {
82         return 0;
83     }
84 
85     int status = aos_sem_wait(sem, timeout);
86     return status;
87 }
88 
mp_sal_sem_give(mp_sal_sem_obj_t * sem)89 mp_int_t mp_sal_sem_give(mp_sal_sem_obj_t *sem)
90 {
91     if (sem == NULL) {
92         LOGE(LOG_TAG, "mpthread sem unlock with sem NULL !!");
93         return -MP_EINVAL;
94     }
95     aos_sem_signal(sem);
96     return 0;
97 }
98 
mp_sal_sem_delete(mp_sal_sem_obj_t * sem)99 void mp_sal_sem_delete(mp_sal_sem_obj_t *sem)
100 {
101     aos_sem_free(sem);
102 }
103