You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

209 lines
5.1 KiB

/******************************************************************************
版权所有 (C), 2018-2099, Radkil
******************************************************************************
文 件 名 : My_freeRTOS.c
版 本 号 : 初稿
作 者 : Radkil
生成日期 : 2026年5月17日
最近修改 :
功能描述 : freeRTOS中间层
修改历史 :
1.日 期 : 2026年5月17日
作 者 : Radkil
修改内容 : 创建文件
******************************************************************************/
#include "common.h"
#include "rd_thread.h"
#ifdef USE_FREERTOS
#include "cmsis_os.h"
#include "cmsis_os2.h"
#include "FreeRTOS.h"
#include "task.h"
#include "string.h"
#include "stdio.h"
#include "lua_base.h"
/*----------------------------------------------*
* 外部变量说明 *
*----------------------------------------------*/
/*----------------------------------------------*
* 外部函数原型说明 *
*----------------------------------------------*/
/*----------------------------------------------*
* 内部函数原型说明 *
*----------------------------------------------*/
/*----------------------------------------------*
* 全局变量 *
*----------------------------------------------*/
/*----------------------------------------------*
* 模块级变量 *
*----------------------------------------------*/
/*----------------------------------------------*
* 常量定义 *
*----------------------------------------------*/
/*----------------------------------------------*
* 宏定义 *
*----------------------------------------------*/
void StackOverflowHook(TaskHandle_t xTask, char *pcTaskName)
{
log_a("!!! Stack Overflow Detected in Task: %s !!!\n", pcTaskName);
while(1) {osDelay(1);}
}
void ShowTaskList(void)
{
char taskInfoBuffer[256];
vTaskList(taskInfoBuffer);
lua_print("Name\t\tState\tPrior\tStack\tNum\n");
lua_print("%s", taskInfoBuffer);
}
void ShowHeapSize(void)
{
size_t iSize = xPortGetFreeHeapSize();
size_t iMin = xPortGetMinimumEverFreeHeapSize();
size_t Rd_MemPoolGetFreeCount(void);
size_t myMempool = Rd_MemPoolGetFreeCount();
size_t Rd_MemPoolGetTotalCount(void);
size_t myTotal = Rd_MemPoolGetTotalCount();
lua_print("freeRTOS used:\t%d\t%d\n", iSize, iMin);
lua_print("mempool free:\t%d\t%d\n", myMempool, myTotal);
}
int Rd_SemInit(void *_sem, int _iPshared, int _iValue)
{
rd_sem_t *pSem = (rd_sem_t *)_sem;
osSemaphoreAttr_t attr = {
.name = NULL,
.attr_bits = 0,
.cb_mem = pSem->cb_buf,
.cb_size = sizeof(pSem->cb_buf)
};
pSem->sem_id = osSemaphoreNew((uint32_t)_iValue + 1, (uint32_t)_iValue, &attr);
if (pSem->sem_id == NULL) {
return RD_FAILURE;
}
pSem->count = _iValue;
return RD_SUCCESS;
}
void Rd_SemWait(void *_sem, const char *_pcFunc, int *_piCnt)
{
rd_sem_t *pSem = (rd_sem_t *)_sem;
(void)_pcFunc;
osSemaphoreAcquire(pSem->sem_id, osWaitForever);
if (_piCnt != NULL) {
(*_piCnt)++;
}
}
void Rd_SemPost(void *_sem, const char *_pcFunc, int *_piCnt)
{
rd_sem_t *pSem = (rd_sem_t *)_sem;
(void)_pcFunc;
osSemaphoreRelease(pSem->sem_id);
if (_piCnt != NULL) {
(*_piCnt)++;
}
}
int Rd_SemDestroy(void *_sem)
{
rd_sem_t *pSem = (rd_sem_t *)_sem;
if (pSem->sem_id != NULL) {
osSemaphoreDelete(pSem->sem_id);
pSem->sem_id = NULL;
}
return RD_SUCCESS;
}
int Rd_MutexInit(void *_pMutex)
{
rd_mutex_t *pMutex = (rd_mutex_t *)_pMutex;
osMutexAttr_t attr = {
.name = NULL,
.attr_bits = osMutexRecursive | osMutexPrioInherit,
.cb_mem = NULL,
.cb_size = 0
};
*pMutex = osMutexNew(&attr);
if (*pMutex == NULL) {
return RD_FAILURE;
}
return RD_SUCCESS;
}
void Rd_MutexLock(void *_pMutex, const char *_pcFunc, int *_piCnt)
{
rd_mutex_t *pMutex = (rd_mutex_t *)_pMutex;
(void)_pcFunc;
if (*pMutex != NULL) {
osMutexAcquire(*pMutex, osWaitForever);
}
if (_piCnt != NULL) {
(*_piCnt)++;
}
}
void Rd_MutexUnlock(void *_pMutex, const char *_pcFunc, int *_piCnt)
{
rd_mutex_t *pMutex = (rd_mutex_t *)_pMutex;
(void)_pcFunc;
if (*pMutex != NULL) {
osMutexRelease(*pMutex);
}
if (_piCnt != NULL) {
(*_piCnt)++;
}
}
int Rd_MutexDestroy(void *_pMutex)
{
rd_mutex_t *pMutex = (rd_mutex_t *)_pMutex;
if (*pMutex != NULL) {
osMutexDelete(*pMutex);
*pMutex = NULL;
}
return RD_SUCCESS;
}
void Rd_Delay(uint32_t Delay)
{
osDelay(Delay);
}
void MyTask_Init(void)
{
#ifndef USE_TALNET
const osThreadAttr_t Lua_attributes = {
.name = "LuaREPL",
.stack_size = 4 * 1024,
.priority = (osPriority_t) osPriorityLow7,
};
void StartLuaREPL(void *argument);
(void)osThreadNew(StartLuaREPL, NULL, &Lua_attributes);
#endif
#ifdef USE_LWIP
const osThreadAttr_t talnet_attributes = {
.name = "talnet",
.stack_size = 6 * 1024,
.priority = (osPriority_t) osPriorityLow6,
};
void vTCPServer_Task(void *pvParameters);
(void)osThreadNew(vTCPServer_Task, NULL, &talnet_attributes);
#endif
}
#endif