finish nimble blehr porting and do some kernel improve
This commit is contained in:
@@ -29,6 +29,7 @@ typedef enum k_err_en {
|
||||
|
||||
K_ERR_MSG_QUEUE_FULL = 900u,
|
||||
K_ERR_MSG_QUEUE_EMPTY,
|
||||
K_ERR_MSG_QUEUE_MSG_NOT_EXIST,
|
||||
|
||||
K_ERR_MUTEX_NOT_OWNER = 1000u,
|
||||
K_ERR_MUTEX_NESTING,
|
||||
@@ -43,9 +44,11 @@ typedef enum k_err_en {
|
||||
|
||||
K_ERR_QUEUE_EMPTY = 1500u,
|
||||
K_ERR_QUEUE_FULL,
|
||||
K_ERR_QUEUE_MSG_NOT_EXIST,
|
||||
|
||||
K_ERR_PEND_NOWAIT = 1600u,
|
||||
K_ERR_PEND_SCHED_LOCKED,
|
||||
K_ERR_PEND_IN_IRQ,
|
||||
K_ERR_PEND_ABNORMAL,
|
||||
K_ERR_PEND_TIMEOUT,
|
||||
K_ERR_PEND_DESTROY,
|
||||
@@ -77,6 +80,7 @@ typedef enum k_err_en {
|
||||
K_ERR_TIMER_INVALID_STATE,
|
||||
K_ERR_TIMER_INVALID_OPT,
|
||||
K_ERR_TIMER_STOPPED,
|
||||
K_ERR_TIMER_RUNNING,
|
||||
} k_err_t;
|
||||
|
||||
#endif /* _TOS_ERR_H_ */
|
||||
|
@@ -79,6 +79,21 @@ __API__ k_err_t tos_msg_queue_get(k_msg_queue_t *msg_queue, void **msg_addr, siz
|
||||
*/
|
||||
__API__ k_err_t tos_msg_queue_put(k_msg_queue_t *msg_queue, void *msg_addr, size_t msg_size, k_opt_t opt);
|
||||
|
||||
/**
|
||||
* @brief Remove one message from the message queue.
|
||||
* Remove one message with certain address from the message queue.
|
||||
*
|
||||
* @attention None
|
||||
*
|
||||
* @param[IN] msg_queue the pointer to the handler of the message queue.
|
||||
* @param[IN] msg_addr the address of the message.
|
||||
*
|
||||
* @return errcode.
|
||||
* @retval #K_ERR_MSG_QUEUE_MSG_NOT_EXIST message to remove is not existed
|
||||
* @retval #K_ERR_NONE return successfully
|
||||
*/
|
||||
__API__ k_err_t tos_msg_queue_remove(k_msg_queue_t *msg_queue, void *msg_addr);
|
||||
|
||||
/**
|
||||
* @brief Flush all of the messages.
|
||||
* Flush all of the messages in the queue.
|
||||
|
@@ -5,7 +5,7 @@
|
||||
|
||||
typedef struct k_queue_st {
|
||||
pend_obj_t pend_obj;
|
||||
k_msg_queue_t msg_queue;
|
||||
k_msg_queue_t msg_queue;
|
||||
} k_queue_t;
|
||||
|
||||
/**
|
||||
@@ -34,19 +34,6 @@ __API__ k_err_t tos_queue_create(k_queue_t *queue);
|
||||
*/
|
||||
__API__ k_err_t tos_queue_destroy(k_queue_t *queue);
|
||||
|
||||
/**
|
||||
* @brief Flush a queue.
|
||||
* flush a queue, clear all the msg in the queue.
|
||||
*
|
||||
* @attention None
|
||||
*
|
||||
* @param[in] queue pointer to the handler of the queue.
|
||||
*
|
||||
* @return errcode
|
||||
* @retval #K_ERR_NONE return successfully.
|
||||
*/
|
||||
__API__ k_err_t tos_queue_flush(k_queue_t *queue);
|
||||
|
||||
/**
|
||||
* @brief Pend a queue.
|
||||
* pend a queue.
|
||||
@@ -55,8 +42,8 @@ __API__ k_err_t tos_queue_flush(k_queue_t *queue);
|
||||
* that means you DONNOT need to alloc memory for msg_addr, msg_addr can just be a pointer.
|
||||
*
|
||||
* @param[in] queue pointer to the handler of the queue.
|
||||
* @param[OUT] msg_addr a pointer point to the message we wanna recive.
|
||||
* @param[OUT] msg_size pointer to the message size returned.
|
||||
* @param[out] msg_addr a pointer point to the message we wanna recive.
|
||||
* @param[out] msg_size pointer to the message size returned.
|
||||
* @param[in] timeout how much time(in k_tick_t) we would like to wait.
|
||||
*
|
||||
* @return errcode
|
||||
@@ -96,6 +83,34 @@ __API__ k_err_t tos_queue_post(k_queue_t *queue, void *msg_addr, size_t msg_size
|
||||
*/
|
||||
__API__ k_err_t tos_queue_post_all(k_queue_t *queue, void *msg_addr, size_t msg_size);
|
||||
|
||||
/**
|
||||
* @brief Flush a queue.
|
||||
* flush a queue, clear all the msg in the queue.
|
||||
*
|
||||
* @attention None
|
||||
*
|
||||
* @param[in] queue pointer to the handler of the queue.
|
||||
*
|
||||
* @return errcode
|
||||
* @retval #K_ERR_NONE return successfully.
|
||||
*/
|
||||
__API__ k_err_t tos_queue_flush(k_queue_t *queue);
|
||||
|
||||
/**
|
||||
* @brief Remove one message from the queue.
|
||||
* Remove one message with certain address from the queue.
|
||||
*
|
||||
* @attention None
|
||||
*
|
||||
* @param[in] queue pointer to the handler of the queue.
|
||||
* @param[in] msg_addr the address of the message.
|
||||
*
|
||||
* @return errcode
|
||||
* @retval #K_ERR_QUEUE_MSG_NOT_EXIST message to remove is not existed.
|
||||
* @retval #K_ERR_NONE return successfully.
|
||||
*/
|
||||
__API__ k_err_t tos_queue_remove(k_queue_t *queue, void *msg_addr);
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _TOS_QUEUE_H_ */
|
||||
|
@@ -9,6 +9,11 @@
|
||||
// if we want the timer run periodically, this option should be passed to tos_timer_create.
|
||||
#define TOS_OPT_TIMER_PERIODIC (k_opt_t)(0x0002u)
|
||||
|
||||
typedef enum timer_change_type_en {
|
||||
TIMER_CHANGE_TYPE_DELAY,
|
||||
TIMER_CHANGE_TYPE_PERIOD,
|
||||
} timer_change_type_t;
|
||||
|
||||
/**
|
||||
* state for timer
|
||||
*/
|
||||
@@ -110,6 +115,39 @@ __API__ k_err_t tos_timer_start(k_timer_t *tmr);
|
||||
*/
|
||||
__API__ k_err_t tos_timer_stop(k_timer_t *tmr);
|
||||
|
||||
/**
|
||||
* @brief Change a timer's delay.
|
||||
*
|
||||
* @attention None
|
||||
*
|
||||
* @param[in] tmr pointer to the handler of the timer.
|
||||
* @param[in] delay new delay of the timer.
|
||||
*
|
||||
* @return errcode
|
||||
* @retval #K_ERR_TIMER_INACTIVE the timer is not active yet.
|
||||
* @retval #K_ERR_TIMER_RUNNING the timer is running.
|
||||
* @retval #K_ERR_TIMER_INVALID_DELAY the delay is invalid.
|
||||
* @retval #K_ERR_NONE return successfully.
|
||||
*/
|
||||
__API__ k_err_t tos_timer_delay_change(k_timer_t *tmr, k_tick_t delay);
|
||||
|
||||
/**
|
||||
* @brief Change a timer's period.
|
||||
*
|
||||
* @attention None
|
||||
*
|
||||
* @param[in] tmr pointer to the handler of the timer.
|
||||
* @param[in] period new period of the timer.
|
||||
*
|
||||
* @return errcode
|
||||
* @retval #K_ERR_TIMER_INACTIVE the timer is not active yet.
|
||||
* @retval #K_ERR_TIMER_RUNNING the timer is running.
|
||||
* @retval #K_ERR_TIMER_INVALID_PERIOD the period is invalid.
|
||||
* @retval #K_ERR_NONE return successfully.
|
||||
*/
|
||||
__API__ k_err_t tos_timer_period_change(k_timer_t *tmr, k_tick_t period);
|
||||
|
||||
|
||||
#if TOS_CFG_TIMER_AS_PROC > 0u
|
||||
|
||||
/**
|
||||
|
@@ -60,7 +60,6 @@ __API__ k_err_t tos_event_pend(k_event_t *event, k_event_flag_t flag_expect, k_e
|
||||
|
||||
TOS_PTR_SANITY_CHECK(event);
|
||||
TOS_PTR_SANITY_CHECK(flag_match);
|
||||
TOS_IN_IRQ_CHECK();
|
||||
|
||||
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||
if (!pend_object_verify(&event->pend_obj, PEND_TYPE_EVENT)) {
|
||||
@@ -91,6 +90,11 @@ __API__ k_err_t tos_event_pend(k_event_t *event, k_event_flag_t flag_expect, k_e
|
||||
return K_ERR_PEND_NOWAIT;
|
||||
}
|
||||
|
||||
if (knl_is_inirq()) {
|
||||
TOS_CPU_INT_ENABLE();
|
||||
return K_ERR_PEND_IN_IRQ;
|
||||
}
|
||||
|
||||
if (knl_is_sched_locked()) {
|
||||
TOS_CPU_INT_ENABLE();
|
||||
return K_ERR_PEND_SCHED_LOCKED;
|
||||
|
@@ -31,20 +31,6 @@ __STATIC__ void msgpool_free(k_msg_t *msg)
|
||||
tos_list_add(&msg->list, &k_msg_freelist);
|
||||
}
|
||||
|
||||
__API__ void tos_msg_queue_flush(k_msg_queue_t *msg_queue)
|
||||
{
|
||||
TOS_CPU_CPSR_ALLOC();
|
||||
k_list_t *curr, *next;
|
||||
|
||||
TOS_CPU_INT_DISABLE();
|
||||
|
||||
TOS_LIST_FOR_EACH_SAFE(curr, next, &msg_queue->queue_head) {
|
||||
msgpool_free(TOS_LIST_ENTRY(curr, k_msg_t, list));
|
||||
}
|
||||
|
||||
TOS_CPU_INT_ENABLE();
|
||||
}
|
||||
|
||||
__API__ k_err_t tos_msg_queue_create(k_msg_queue_t *msg_queue)
|
||||
{
|
||||
TOS_PTR_SANITY_CHECK(msg_queue);
|
||||
@@ -82,6 +68,9 @@ __API__ k_err_t tos_msg_queue_get(k_msg_queue_t *msg_queue, void **msg_addr, siz
|
||||
TOS_CPU_CPSR_ALLOC();
|
||||
k_msg_t *msg;
|
||||
|
||||
TOS_PTR_SANITY_CHECK(msg_queue);
|
||||
TOS_PTR_SANITY_CHECK(msg_addr);
|
||||
|
||||
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||
if (!knl_object_verify(&msg_queue->knl_obj, KNL_OBJ_TYPE_MSG_QUEUE)) {
|
||||
return K_ERR_OBJ_INVALID;
|
||||
@@ -110,6 +99,9 @@ __API__ k_err_t tos_msg_queue_put(k_msg_queue_t *msg_queue, void *msg_addr, size
|
||||
TOS_CPU_CPSR_ALLOC();
|
||||
k_msg_t *msg;
|
||||
|
||||
TOS_PTR_SANITY_CHECK(msg_queue);
|
||||
TOS_PTR_SANITY_CHECK(msg_addr);
|
||||
|
||||
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||
if (!knl_object_verify(&msg_queue->knl_obj, KNL_OBJ_TYPE_MSG_QUEUE)) {
|
||||
return K_ERR_OBJ_INVALID;
|
||||
@@ -138,5 +130,63 @@ __API__ k_err_t tos_msg_queue_put(k_msg_queue_t *msg_queue, void *msg_addr, size
|
||||
return K_ERR_NONE;
|
||||
}
|
||||
|
||||
__API__ k_err_t tos_msg_queue_remove(k_msg_queue_t *msg_queue, void *msg_addr)
|
||||
{
|
||||
TOS_CPU_CPSR_ALLOC();
|
||||
k_msg_t *msg;
|
||||
k_list_t *curr, *next;
|
||||
int is_msg_exist = K_FALSE;
|
||||
|
||||
TOS_PTR_SANITY_CHECK(msg_queue);
|
||||
TOS_PTR_SANITY_CHECK(msg_addr);
|
||||
|
||||
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||
if (!knl_object_verify(&msg_queue->knl_obj, KNL_OBJ_TYPE_MSG_QUEUE)) {
|
||||
return K_ERR_OBJ_INVALID;
|
||||
}
|
||||
#endif
|
||||
|
||||
TOS_CPU_INT_DISABLE();
|
||||
|
||||
TOS_LIST_FOR_EACH_SAFE(curr, next, &msg_queue->queue_head) {
|
||||
msg = TOS_LIST_ENTRY(curr, k_msg_t, list);
|
||||
|
||||
if (msg->msg_addr != msg_addr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
is_msg_exist = K_TRUE;
|
||||
msgpool_free(msg);
|
||||
}
|
||||
|
||||
TOS_CPU_INT_ENABLE();
|
||||
|
||||
return is_msg_exist ? K_ERR_NONE : K_ERR_MSG_QUEUE_MSG_NOT_EXIST;
|
||||
}
|
||||
|
||||
__API__ void tos_msg_queue_flush(k_msg_queue_t *msg_queue)
|
||||
{
|
||||
TOS_CPU_CPSR_ALLOC();
|
||||
k_list_t *curr, *next;
|
||||
|
||||
if(!msg_queue) {
|
||||
return;
|
||||
}
|
||||
|
||||
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||
if (!knl_object_verify(&msg_queue->knl_obj, KNL_OBJ_TYPE_MSG_QUEUE)) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
TOS_CPU_INT_DISABLE();
|
||||
|
||||
TOS_LIST_FOR_EACH_SAFE(curr, next, &msg_queue->queue_head) {
|
||||
msgpool_free(TOS_LIST_ENTRY(curr, k_msg_t, list));
|
||||
}
|
||||
|
||||
TOS_CPU_INT_ENABLE();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -53,6 +53,8 @@ __API__ k_err_t tos_mutex_create(k_mutex_t *mutex)
|
||||
{
|
||||
TOS_PTR_SANITY_CHECK(mutex);
|
||||
|
||||
TOS_IN_IRQ_CHECK();
|
||||
|
||||
pend_object_init(&mutex->pend_obj, PEND_TYPE_MUTEX);
|
||||
mutex->pend_nesting = (k_nesting_t)0u;
|
||||
mutex->owner = K_NULL;
|
||||
@@ -67,6 +69,7 @@ __API__ k_err_t tos_mutex_destroy(k_mutex_t *mutex)
|
||||
TOS_CPU_CPSR_ALLOC();
|
||||
|
||||
TOS_PTR_SANITY_CHECK(mutex);
|
||||
TOS_IN_IRQ_CHECK();
|
||||
|
||||
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||
if (!pend_object_verify(&mutex->pend_obj, PEND_TYPE_MUTEX)) {
|
||||
@@ -168,6 +171,7 @@ __API__ k_err_t tos_mutex_post(k_mutex_t *mutex)
|
||||
TOS_CPU_CPSR_ALLOC();
|
||||
|
||||
TOS_PTR_SANITY_CHECK(mutex);
|
||||
TOS_IN_IRQ_CHECK();
|
||||
|
||||
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||
if (!pend_object_verify(&mutex->pend_obj, PEND_TYPE_MUTEX)) {
|
||||
|
@@ -106,6 +106,8 @@ __KERNEL__ void pend_task_wakeup(k_task_t *task, pend_state_t state)
|
||||
__KERNEL__ void pend_task_block(k_task_t *task, pend_obj_t *object, k_tick_t timeout)
|
||||
{
|
||||
readyqueue_remove(task);
|
||||
|
||||
task->pend_state = PEND_STATE_NONE;
|
||||
pend_list_add(task, object);
|
||||
|
||||
if (timeout != TOS_TIME_FOREVER) {
|
||||
|
@@ -38,25 +38,6 @@ __API__ k_err_t tos_queue_destroy(k_queue_t *queue)
|
||||
return K_ERR_NONE;
|
||||
}
|
||||
|
||||
__API__ k_err_t tos_queue_flush(k_queue_t *queue)
|
||||
{
|
||||
TOS_CPU_CPSR_ALLOC();
|
||||
|
||||
TOS_PTR_SANITY_CHECK(queue);
|
||||
|
||||
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||
if (!pend_object_verify(&queue->pend_obj, PEND_TYPE_QUEUE)) {
|
||||
return K_ERR_OBJ_INVALID;
|
||||
}
|
||||
#endif
|
||||
|
||||
TOS_CPU_INT_DISABLE();
|
||||
tos_msg_queue_flush(&queue->msg_queue);
|
||||
TOS_CPU_INT_ENABLE();
|
||||
|
||||
return K_ERR_NONE;
|
||||
}
|
||||
|
||||
__API__ k_err_t tos_queue_pend(k_queue_t *queue, void **msg_addr, size_t *msg_size, k_tick_t timeout)
|
||||
{
|
||||
TOS_CPU_CPSR_ALLOC();
|
||||
@@ -86,6 +67,11 @@ __API__ k_err_t tos_queue_pend(k_queue_t *queue, void **msg_addr, size_t *msg_si
|
||||
return K_ERR_PEND_NOWAIT;
|
||||
}
|
||||
|
||||
if (knl_is_inirq()) {
|
||||
TOS_CPU_INT_ENABLE();
|
||||
return K_ERR_PEND_IN_IRQ;
|
||||
}
|
||||
|
||||
if (knl_is_sched_locked()) {
|
||||
TOS_CPU_INT_ENABLE();
|
||||
return K_ERR_PEND_SCHED_LOCKED;
|
||||
@@ -166,5 +152,45 @@ __API__ k_err_t tos_queue_post_all(k_queue_t *queue, void *msg_addr, size_t msg_
|
||||
return queue_do_post(queue, msg_addr, msg_size, OPT_POST_ALL);
|
||||
}
|
||||
|
||||
__API__ k_err_t tos_queue_remove(k_queue_t *queue, void *msg_addr)
|
||||
{
|
||||
TOS_CPU_CPSR_ALLOC();
|
||||
k_err_t err;
|
||||
|
||||
TOS_PTR_SANITY_CHECK(queue);
|
||||
TOS_PTR_SANITY_CHECK(msg_addr);
|
||||
|
||||
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||
if (!pend_object_verify(&queue->pend_obj, PEND_TYPE_QUEUE)) {
|
||||
return K_ERR_OBJ_INVALID;
|
||||
}
|
||||
#endif
|
||||
|
||||
TOS_CPU_INT_DISABLE();
|
||||
err = tos_msg_queue_remove(&queue->msg_queue, msg_addr);
|
||||
TOS_CPU_INT_ENABLE();
|
||||
|
||||
return err == K_ERR_MSG_QUEUE_MSG_NOT_EXIST ? K_ERR_QUEUE_MSG_NOT_EXIST : K_ERR_NONE;
|
||||
}
|
||||
|
||||
__API__ k_err_t tos_queue_flush(k_queue_t *queue)
|
||||
{
|
||||
TOS_CPU_CPSR_ALLOC();
|
||||
|
||||
TOS_PTR_SANITY_CHECK(queue);
|
||||
|
||||
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||
if (!pend_object_verify(&queue->pend_obj, PEND_TYPE_QUEUE)) {
|
||||
return K_ERR_OBJ_INVALID;
|
||||
}
|
||||
#endif
|
||||
|
||||
TOS_CPU_INT_DISABLE();
|
||||
tos_msg_queue_flush(&queue->msg_queue);
|
||||
TOS_CPU_INT_ENABLE();
|
||||
|
||||
return K_ERR_NONE;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -86,7 +86,6 @@ __API__ k_err_t tos_sem_pend(k_sem_t *sem, k_tick_t timeout)
|
||||
TOS_CPU_CPSR_ALLOC();
|
||||
|
||||
TOS_PTR_SANITY_CHECK(sem);
|
||||
TOS_IN_IRQ_CHECK();
|
||||
|
||||
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||
if (!pend_object_verify(&sem->pend_obj, PEND_TYPE_SEM)) {
|
||||
@@ -107,6 +106,11 @@ __API__ k_err_t tos_sem_pend(k_sem_t *sem, k_tick_t timeout)
|
||||
return K_ERR_PEND_NOWAIT;
|
||||
}
|
||||
|
||||
if (knl_is_inirq()) {
|
||||
TOS_CPU_INT_ENABLE();
|
||||
return K_ERR_PEND_IN_IRQ;
|
||||
}
|
||||
|
||||
if (knl_is_sched_locked()) {
|
||||
TOS_CPU_INT_ENABLE();
|
||||
return K_ERR_PEND_SCHED_LOCKED;
|
||||
|
@@ -211,6 +211,55 @@ __API__ k_err_t tos_timer_stop(k_timer_t *tmr)
|
||||
return K_ERR_NONE;
|
||||
}
|
||||
|
||||
__STATIC__ k_err_t timer_change(k_timer_t *tmr, k_tick_t new_val, timer_change_type_t change_type)
|
||||
{
|
||||
TOS_PTR_SANITY_CHECK(tmr);
|
||||
|
||||
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||
if (!knl_object_verify(&tmr->knl_obj, KNL_OBJ_TYPE_TIMER)) {
|
||||
return K_ERR_OBJ_INVALID;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (tmr->state == TIMER_STATE_UNUSED) {
|
||||
return K_ERR_TIMER_INACTIVE;
|
||||
}
|
||||
|
||||
if (tmr->state == TIMER_STATE_RUNNING) {
|
||||
return K_ERR_TIMER_RUNNING;
|
||||
}
|
||||
|
||||
if (tmr->opt == TOS_OPT_TIMER_ONESHOT &&
|
||||
change_type == TIMER_CHANGE_TYPE_DELAY &&
|
||||
new_val == (k_tick_t)0u) {
|
||||
return K_ERR_TIMER_INVALID_DELAY;
|
||||
}
|
||||
|
||||
if (tmr->opt == TOS_OPT_TIMER_PERIODIC &&
|
||||
change_type == TIMER_CHANGE_TYPE_PERIOD &&
|
||||
new_val == (k_tick_t)0u) {
|
||||
return K_ERR_TIMER_INVALID_PERIOD;
|
||||
}
|
||||
|
||||
if (change_type == TIMER_CHANGE_TYPE_DELAY) {
|
||||
tmr->delay = new_val;
|
||||
} else {
|
||||
tmr->period = new_val;
|
||||
}
|
||||
|
||||
return K_ERR_NONE;
|
||||
}
|
||||
|
||||
__API__ k_err_t tos_timer_delay_change(k_timer_t *tmr, k_tick_t delay)
|
||||
{
|
||||
return timer_change(tmr, delay, TIMER_CHANGE_TYPE_DELAY);
|
||||
}
|
||||
|
||||
__API__ k_err_t tos_timer_period_change(k_timer_t *tmr, k_tick_t period)
|
||||
{
|
||||
return timer_change(tmr, period, TIMER_CHANGE_TYPE_PERIOD);
|
||||
}
|
||||
|
||||
__KERNEL__ k_tick_t timer_next_expires_get(void)
|
||||
{
|
||||
TOS_CPU_CPSR_ALLOC();
|
||||
|
Reference in New Issue
Block a user