doubao_chat/lib/net/tencent/os/freeRTOS/os_wrapper_freeRTOS.c

253 lines
5.3 KiB
C

#include "os_wrapper.h"
#include "os/os_api.h"
#include "system/timer.h"
#define USE_MALLOC_SETTING 1 //1:信号量,互斥锁用动态分配创建 0:静态创建,SDK断网后需处理释放(未完善)
long os_wrapper_get_forever_time()
{
return 0;
}
/***************************信号量*********************************/
#if USE_MALLOC_SETTING
void *os_wrapper_create_signal_mutex(int init_count)
{
OS_SEM *sem = zalloc(sizeof(OS_SEM));
if (sem) {
os_sem_create(sem, init_count);
}
return (void *)sem;
}
void os_wrapper_delete_signal_mutex(void **mutex) //信号量释放函数
{
if (!*mutex) {
return;
}
if (os_sem_valid((OS_SEM *)*mutex)) {
os_wrapper_post_signal((OS_SEM *)*mutex); //删除前先post
os_sem_del((OS_SEM *)*mutex, 1);
free(*mutex);
*mutex = NULL;
}
}
#else
static int sem_create_cnt = 0, mutex_create_cnt = 0;
static OS_SEM wrapper_sem[30] = {0};
void *os_wrapper_create_signal_mutex(int init_count)
{
os_sem_create(&wrapper_sem[sem_create_cnt], init_count);
if (!os_sem_valid(&wrapper_sem[sem_create_cnt])) {
printf("-------%s------------%d----------sem create failed!!", __func__, __LINE__);
return NULL;
}
printf("---------%s------------%d-----------cnt = %d", __func__, __LINE__, sem_create_cnt);
sem_create_cnt++;
return (void *)&wrapper_sem[sem_create_cnt - 1];
}
void os_wrapper_delete_signal_mutex(void **mutex) //信号量释放函数
{
if (!*mutex) {
return;
}
if (os_sem_valid((OS_SEM *)*mutex)) {
os_wrapper_post_signal((OS_SEM *)*mutex); //删除前先post
os_sem_del((OS_SEM *)*mutex, 1);
*mutex = NULL;
}
}
#endif
bool os_wrapper_wait_signal(void *mutex, long time_ms)
{
if (!mutex) {
return false;
}
if (!os_sem_valid((OS_SEM *)mutex)) {
return false;
}
return (os_sem_pend((OS_SEM *)mutex, time_ms) == 0);
}
void os_wrapper_post_signal(void *mutex)
{
if (!mutex) {
return;
}
if (!os_sem_valid((OS_SEM *)mutex)) {
return;
}
os_sem_post((OS_SEM *)mutex);
}
/***************************互斥锁*********************************/
#if USE_MALLOC_SETTING
void *os_wrapper_create_locker_mutex()
{
OS_MUTEX *mutex = zalloc(sizeof(OS_MUTEX));
if (mutex) {
os_mutex_create(mutex);
}
return (void *)mutex;
}
void os_wrapper_del_locker_mutex(void **mutex)
{
if (!*mutex) {
return;
}
if (os_mutex_valid((OS_MUTEX *)*mutex)) {
os_wrapper_unlock_mutex((OS_MUTEX *)*mutex); //删除前先post
os_mutex_del((OS_MUTEX *)*mutex, 0);
free(*mutex);
*mutex = NULL;
}
}
#else
static OS_MUTEX wrapper_mutex[30] = {0};
void *os_wrapper_create_locker_mutex()
{
os_mutex_create(&wrapper_mutex[mutex_create_cnt]);
if (!os_mutex_valid(&wrapper_mutex[mutex_create_cnt])) {
printf("-------%s------------%d----------mutex create failed!!", __func__, __LINE__);
return NULL;
}
printf("---------%s------------%d-----------cnt = %d", __func__, __LINE__, mutex_create_cnt);
mutex_create_cnt++;
return (void *)&wrapper_mutex[mutex_create_cnt - 1];
}
void os_wrapper_del_locker_mutex(void **mutex)
{
if (!*mutex) {
return;
}
if (os_mutex_valid((OS_MUTEX *)*mutex)) {
os_wrapper_unlock_mutex((OS_MUTEX *)*mutex); //删除前先post
os_mutex_del((OS_MUTEX *)*mutex, 0);
*mutex = NULL;
}
}
#endif
bool os_wrapper_lock_mutex(void *mutex, long time_ms)
{
if (!mutex) {
return false;
}
if (!os_mutex_valid((OS_MUTEX *)mutex)) {
return false;
}
return (os_mutex_pend((OS_MUTEX *)mutex, time_ms) == 0);
}
void os_wrapper_unlock_mutex(void *mutex)
{
if (!mutex) {
return;
}
if (!os_mutex_valid((OS_MUTEX *)mutex)) {
return;
}
os_mutex_post((OS_MUTEX *)mutex);
}
/**************************延时函数*********************************/
void os_wrapper_sleep(long time_ms)
{
msleep(time_ms);
}
extern u32 timer_get_ms(void);
long os_wrapper_get_time_ms()
{
return timer_get_ms();
}
/**************************线程函数*********************************/
void *os_wrapper_start_thread(void *thread_func, void *param, const char *name, int prior, int stack_depth)
{
int *thread_handle = (int *)malloc(sizeof(int));
memset(thread_handle, 0, sizeof(int));
if (0 != thread_fork(name, prior + 20, stack_depth, 0, thread_handle, thread_func, param)) {
free(thread_handle);
return NULL;
}
return (void *)thread_handle;
}
void os_wrapper_thread_delete(void **thread_handle)
{
if (*thread_handle) {
thread_kill(*thread_handle, KILL_WAIT);
free(*thread_handle);
*thread_handle = NULL;
}
}
/**************************定时器函数*********************************/
void os_wrapper_start_timer(void **handle, void *func, int time_ms, bool repeat)
{
if (handle == NULL) {
return;
}
if (repeat) {
*handle = (void *)sys_timer_add_to_task("tc_tvs_task", NULL, func, time_ms);
} else {
*handle = (void *)sys_timeout_add_to_task("tc_tvs_task", NULL, func, time_ms);
}
}
void os_wrapper_stop_timer(void *handle)
{
if (handle == NULL) {
return;
}
sys_timer_del((int)handle);
}