2 Star 5 Fork 4

稀风 / KOS

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
u_syscall3.c 6.03 KB
一键复制 编辑 原始数据 按行查看 历史
稀风 提交于 2023-04-16 21:30 . 优化代码
#include <u_syscall.h>
#include <stdarg.h>
#define BUFF_LEN 1024
static U08 print_buff[BUFF_LEN] = {0};
// 用于数值 0 ~ 15 转成对应的字符 '0' ~ 'F'
static const U08 IntToStr[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
/******************************************************************************
* 函数名称: void TaskDestory(void)
* 功能说明: 销毁当前任务
* 输入参数: 无
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
E_RET TaskDestory(void)
{
return _SYS_CALL0(_NR_TaskDestory);
}
/******************************************************************************
* 函数名称: U32 print(const char * fmt, ...)
* 功能说明: 用户打印
* 输入参数: const char * fmt --输出格式, 目前支持的格式:
%c: 字符
%s: 字符串
%x: 十六进制
%d: 十进制
    ... --可变参数
* 输出参数: 无
* 函数返回: 成功打印的字符个数
* 其它说明: 无
******************************************************************************/
U32 print(const char * fmt, ...)
{
va_list args;
U32 index = 0;
U08* ptr = print_buff;
U08* pTmp = NULL;
S16 i = 0;
U08 tmp = 0;
U32 num_x = 0;
S32 num_d = 0;
U08 isFirst0 = 0;
U08 decnum[18];
U08 decno = 0;
va_start(args, fmt);
// 遍历字符串 fmt
for(; *fmt; ++fmt)
{
// 寻找格式转换字符 '%', 如果不是 '%', 则将其转存到 print_buff 中
if(*fmt != '%')
{
if(index < BUFF_LEN)
ptr[index++] = *fmt;
continue;
}
// 如果找到了 '%', 则取 '%' 后的第一个字符
++fmt;
switch (*fmt) // 根据 '%' 后的字符类型采取不同的打印接口
{
case 'c': // 字符
if(index < BUFF_LEN)
ptr[index++] = (U08)va_arg(args, U32);
break;
case 's': // 字符串
pTmp = (U08 *)va_arg(args, U32);
while(*pTmp)
{
if(index < BUFF_LEN)
ptr[index++] = *pTmp++;
}
break;
case 'x': // 十六进制
ptr[index++] = '0';
ptr[index++] = 'x';
num_x = (U32)va_arg(args, U32);
for(i = 0; i < 8; i++)
{
tmp = num_x & 0xF;
num_x = num_x >> 4;
if(index < BUFF_LEN)
ptr[index+7-i] = IntToStr[tmp];
}
index += 9;
break;
case 'd': // 十进制
num_d = (S32)va_arg(args, U32);
if(num_d < 0)
{
if(index < BUFF_LEN)
ptr[index++] = '-';
num_d = -num_d;
}
while (1)
{
decnum[decno] = num_d % 10;
num_d = num_d / 10;
if (num_d == 0)
break;
decno++;
}
for (i = decno+1; i > 0; i--)
{
if(index < BUFF_LEN)
ptr[index++] = IntToStr[decnum[i-1]];
}
break;
default:
break;
}
}
va_end(args);
return _SYS_CALL2(_NR_print, ptr, index);
}
/******************************************************************************
* 函数名称: E_RET SetCursorPos(U16 x, U16 y)
* 功能说明: 设置光标位置
* 输入参数: U16 x --横坐标
    U16 y --纵坐标
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 无
******************************************************************************/
E_RET SetCursorPos(U16 x, U16 y)
{
return _SYS_CALL2(_NR_SetCursorPos, x, y);
}
/******************************************************************************
* 函数名称: MUTEX* SYS_MutexCreat(void)
* 功能说明: 创建互斥锁
* 输入参数: 无
* 输出参数: 无
* 函数返回: MUTEX* --互斥锁
* 其它说明:
******************************************************************************/
MUTEX* MutexCreat(void)
{
return (MUTEX*)_SYS_CALL0(_NR_MutexCreat);
}
/******************************************************************************
* 函数名称: E_RET SYS_MutexLock(MUTEX* mutex)
* 功能说明: 上锁
* 输入参数: MUTEX* mutex --互斥锁
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 无
******************************************************************************/
E_RET MutexLock(MUTEX* mutex)
{
return _SYS_CALL1(_NR_MutexLock, mutex);
}
/******************************************************************************
* 函数名称: E_RET SYS_MutexLock(MUTEX* mutex)
* 功能说明: 解锁
* 输入参数: MUTEX* mutex --互斥锁
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 无
******************************************************************************/
E_RET MutexUnLock(MUTEX* mutex)
{
return _SYS_CALL1(_NR_MutexUnLock, mutex);
}
/******************************************************************************
* 函数名称: E_RET SYS_MutexLock(MUTEX* mutex)
* 功能说明: 销毁互斥锁
* 输入参数: MUTEX* mutex --互斥锁
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 无
******************************************************************************/
E_RET MutexDestory(MUTEX* mutex)
{
return _SYS_CALL1(_NR_MutexDestory, mutex);
}
1
https://gitee.com/thin-wind/KOS.git
git@gitee.com:thin-wind/KOS.git
thin-wind
KOS
KOS
main

搜索帮助