Alios-things - rhino内核(二)COMMON文
1. k_atomic
1.1 功能
提供原子操作,原子性来源于开关中断,与硬件体系无关。Linux的原子操作与同步机制这篇文章,讲了不同体系下基于硬件的原子操作的实现。
1.2 函数
函数主要有十二个,包括:加、减、自增、自减、赋值、取值、或、异或、与非、赋值0、compare and swap。
其中compare and swap,大致就是判断是否需要对target目标的值进行更新。
1.3 参考链接
[1]. Linux的原子操作与同步机制 , https://www.cnblogs.com/fanzhidongyzby/p/3654855.html
[2]. Alios-things , https://github.com/chengshuyi/AliOS-Things/blob/master/kernel/rhino/common/k_atomic.c
2. k_fifo
2.2 功能
提供进程间通信(半双工)。
2.3 结构体
成员名称 | 作用 |
---|---|
in | 数据流的末尾,值可以大于fifo的size |
out | 数据流的开始,值可以大于fifo的size |
mask | 掩码,主要用来计算in和out的有效值,使in和out小于size |
data | 数据流指针 |
free_bytes | 未使用的空间长度 |
size | k_fifo所能容纳的空间尺寸 |
2.4 函数
主要包括五个函数,即FIFO的初始化、写入data、读取data、读取所有data。其中fifo_out_peek是只读取data,但不对k_fifo成员变量进行修改,即fifo仍保留被读取的data。

2.5 参考链接
[1]. Alios-things, https://github.com/chengshuyi/AliOS-Things/blob/master/kernel/rhino/common/k_fifo.c
[2]. 《UNIX网络编程 卷二:进程间通信》, 管道和FIFO
3. k_trace
3.1 功能
利用k_fifo结构体,跟踪信息。是k_fifo应用于shell里面的典型例子。
3.2 函数
函数很多,包括对task、sem、mutex、event、buf queue、timer、memory management和work queue的操作进行记录。
void _trace_init(void);
void _trace_task_switch(ktask_t *from, ktask_t *to);
void _trace_intrpt_task_switch(ktask_t *from, ktask_t *to);
void _trace_task_create(ktask_t *task);
void _trace_task_sleep(ktask_t *task, tick_t ticks);
void _trace_task_pri_change(ktask_t *task, ktask_t *task_pri_chg, uint8_t pri);
void _trace_task_suspend(ktask_t *task, ktask_t *task_suspended);
void _trace_task_resume(ktask_t *task, ktask_t *task_resumed);
void _trace_task_del(ktask_t *task, ktask_t *task_del);
void _trace_task_abort(ktask_t *task, ktask_t *task_abort);
/* semaphore trace function */
void _trace_sem_create(ktask_t *task, ksem_t *sem);
void _trace_sem_overflow(ktask_t *task, ksem_t *sem);
void _trace_sem_del(ktask_t *task, ksem_t *sem);
void _trace_sem_get_success(ktask_t *task, ksem_t *sem);
void _trace_sem_get_blk(ktask_t *task, ksem_t *sem, tick_t wait_option);
void _trace_sem_task_wake(ktask_t *task, ktask_t *task_waked_up, ksem_t *sem,
uint8_t opt_wake_all);
void _trace_sem_cnt_increase(ktask_t *task, ksem_t *sem);
/* mutex trace function */
void _trace_mutex_create(ktask_t *task, kmutex_t *mutex, const name_t *name);
void _trace_mutex_release(ktask_t *task, ktask_t *task_release,
uint8_t new_pri);
void _trace_mutex_get(ktask_t *task, kmutex_t *mutex, tick_t wait_option);
void _trace_task_pri_inv(ktask_t *task, ktask_t *mtxtsk);
void _trace_mutex_get_blk(ktask_t *task, kmutex_t *mutex, tick_t wait_option);
void _trace_mutex_release_success(ktask_t *task, kmutex_t *mutex);
void _trace_mutex_task_wake(ktask_t *task, ktask_t *task_waked_up,
kmutex_t *mutex);
void _trace_mutex_del(ktask_t *task, kmutex_t *mutex);
/* event trace function */
void _trace_event_create(ktask_t *task, kevent_t *event, const name_t *name,
uint32_t flags_init);
void _trace_event_get(ktask_t *task, kevent_t *event);
void _trace_event_get_blk(ktask_t *task, kevent_t *event, tick_t wait_option);
void _trace_event_task_wake(ktask_t *task, ktask_t *task_waked_up,
kevent_t *event);
void _trace_event_del(ktask_t *task, kevent_t *event);
/* buf_queue trace function */
void _trace_buf_queue_create(ktask_t *task, kbuf_queue_t *buf_queue);
void _trace_buf_max(ktask_t *task, kbuf_queue_t *buf_queue, void *p_void,
size_t msg_size);
void _trace_buf_post(ktask_t *task, kbuf_queue_t *buf_queue, void *p_void,
size_t msg_size);
void _trace_buf_queue_task_wake(ktask_t *task, ktask_t *task_waked_up,
kbuf_queue_t *buf_queue);
void _trace_buf_queue_get_blk(ktask_t *task, kbuf_queue_t *buf_queue,
tick_t wait_option);
/* timer trace function */
void _trace_timer_create(ktask_t *task, ktimer_t *timer);
void _trace_timer_del(ktask_t *task, ktimer_t *timer);
/* mblk trace function */
void _trace_mblk_pool_create(ktask_t *task, mblk_pool_t *pool);
/* mm trace function */
//void _trace_mm_pool_create(ktask_t *task, mm_pool_t *pool);
/* work queue trace */
void _trace_work_init(ktask_t *task, kwork_t *work);
void _trace_workqueue_create(ktask_t *task, kworkqueue_t *workqueue);
void _trace_workqueue_del(ktask_t *task, kworkqueue_t *workqueue);
3.3 参考链接
[1]. Alios-things, https://github.com/chengshuyi/AliOS-Things/blob/master/kernel/rhino/common/k_trace.c
[2]. Linux trace使用入门, https://www.cnblogs.com/yangykaifa/p/7238419.html