一、前言
本文针对thread_adapter、memory_adapter、time_adapter部分进行解读,也是samgr/adapter下关于POSIX和CMSIS的最后一部分代码。
二、头文件分析
- thread_adapter
在samgr\adapter\thread_adapter.h中对线程的操作进行声明。
typedef void *(*Runnable)(void *argv); //函数指针
typedef struct ThreadAttr ThreadAttr;
struct ThreadAttr {
const char *name; // name of the thread 线程名
uint32 stackSize; // size of stack 栈大小
uint8 priority; // initial thread priority 优先级
uint8 reserved1; // reserved1 (must be 0) 预留
uint16 reserved2; // reserved2 (must be 0)
};
MutexId MUTEX_InitValue(void);//申请锁
void MUTEX_Lock(MutexId mutex);//加锁
void MUTEX_Unlock(MutexId mutex);//解锁
//保障计算进程中创建线程个数的线程安全
void MUTEX_GlobalLock(void);//加锁
void MUTEX_GlobalUnlock(void);//解锁
ThreadId THREAD_Create(Runnable run, void *argv, const ThreadAttr *attr);//创建线程
int THREAD_Total(void);//获取线程总数
void *THREAD_GetThreadLocal(void);//获取线程存储的值
void THREAD_SetThreadLocal(const void *local);//记录local值
- memory_adapter
在samgr\adapter\memory_adapter.h中对分配内存的操作进行声明。
void *SAMGR_Malloc(uint32 size);//分配size大小的内存
void SAMGR_Free(void *buffer);//释放buffer指向的缓冲区
- time_adapter
在samgr\adapter\time_adapter.h中对时间相关的操作进行声明。
int32 WDT_Start(uint32 ms);//开始
int32 WDT_Reset(uint32 ms);//重置
int32 WDT_Stop(void);//停止
uint64 SAMGR_GetProcessTime(void);//获取时间
三、函数实现分析
在samgr\adapter\posix\thread_adapter.c中实现POSIX的线程操作。
#define PRI_BUTT 39
#define MIN_STACK_SIZE 0x8000
static int g_threadCount = 0; //记录线程数,注意在线程被释放的时候应减1
static pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;//静态初始化锁,用于保障当前进程线程数量的计数
static pthread_key_t g_localKey = -1; //类似线程的全局变量
static pthread_once_t g_localKeyOnce = PTHREAD_ONCE_INIT; //保障pthread_once中调用的函数只执行一次
//申请一个已初始化的锁
Mu