📄 platform.h
字号:
/*********************************
platform.h
***********************************/
#ifndef _PLATFORM_H_
#define _PLATFORM_H_
#define USE
#define NO
#define ERROR (-1)
#define OK (0)
#undef NULL
#define NULL 0
#define MUST_BE_ZERO (0)
#define NO_WAIT (0)
#define WAIT_FOREVER (-1)
/*linux主机上的CLOCKS_PER_SEC为1000000而uclinux上为1000*/
/*tick的间隔时间,以ms为单位*/
#define TICK_INTEVAL_ms (1000/CLOCKS_PER_SEC)
/*tick的间隔时间,以us为单位*/
#define TICK_INTEVAL_us (1000000/CLOCKS_PER_SEC)
void print(char* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt,ap);
va_end(ap);
}
#define pl() print("%s %d ", __FILE__, __LINE__);
typedef int TASK_ID;
typedef int SEM_ID;
typedef int MSG_Q_ID;
#ifndef __TASK__
/************************************************************************************
发 起 任 务
函数名: taskSpawn()
功能: 发起一个任务
参数: name 指针类型,任务的名称,仅作为创建任务出错时打印使用
priority 实时任务的优先级,linux下实时任务的优先级范围为1-99,其中99
为最高优先级,但为了适应vxworks及其他实时操作系统的概念,本函数
使用1为最高优先级,99为最低优先级。
options 未使用
stackSize 指定任务堆栈的大小,且该值必须大于16384Byte
entryPt 任务的入口函数
arg1 任务函数的入参, 指针强制转换成的整型值
arg2 发起任务的类型,可选参数为:
SCHED_FIFO :发起一个先进先出的实时任务,实时系统需要的正是这一类
任务,FIFO任务根据优先级调度,如果没有高优先级任务到
达,则该任务将一直占用cpu,直到主动放弃。
SCHED_RR :发起一个时间片轮转实时任务,是FIFO类型任务的一个补充,
为了保证多个具有相同优先级的实时任务任务具有基本相等
的使用cpu的机会,应将这几个任务设置为本类型。
SCHED_OTHER :发起一个分时调度的任务,该任务不具有实时性,优先级也
是最低的,始终给实时任务让道。
arg3-10 未使用
返回值: OK 创建任务成功
ERROR 创建失败
*************************************************************************************/
int taskSpawn
(
USE char * name, /* 任务的名称 */
USE int priority, /* 实时任务的优先级 1-99,1为高优先级 */
NO int options, /* 选项 */
USE int stackSize, /* 任务堆栈的大小 必须大于16384字节*/
USE void * (*entryPt)(void *), /* 任务的函数入口 */
USE int arg1, /* 这是一个指针值,任务入口函数的入参 */
NO int arg2, /*任务类型,实时任务可使用SCHED_FIFO和和SCHED_RR*/
NO int arg3, /*下面的参数不使用*/
NO int arg4,
NO int arg5,
NO int arg6,
NO int arg7,
NO int arg8,
NO int arg9,
NO int arg10
);
/********************************************************************************
删除一个任务
函数名 : taskDelete()
功能 : 删除一个已经存在的任务
参数 : tid 被删除任务的id
返回值 : OK 成功删除任务
ERROR 删除失败
*********************************************************************************/
int taskDelete
(
int tid /* task ID of task to delete */
);
/*******************************************************************************
任务延时
函数名 : taskDelay()
功能 : 任务延时
参数 : ticks 任务延迟的tick数,arm下如果宏CLOCKS_PER_SECOND设置为100,
则每个tick的时长为10ms
返回值 : OK 设置成功
ERROR 设置失败
********************************************************************************/
int taskDelay
(
int ticks /* number of ticks to delay task */
);
/********************************************************************************
当前任务的id
函数名 : taskIdSelf()
功能 : 查询当前任务的id
参数 : 无
返回值 : 当前任务id 成功
ERROR 查询失败
*********************************************************************************/
int taskIdSelf();
/*用户任务入口*/
void userApp();
/*当linux线程被取消的时候将执行的指定函数*/
#define taskDeleteHookAdd(deleteHook)\
{\
struct _pthread_cleanup_buffer buffer;\
\
_pthread_cleanup_push(&buffer, deleteHook, NULL);\
}
/**********************************************************************
注意,linux下无锁定任务切换的函数,只能通过线程互斥方法来
实现,即所有 "用户任务" 在执行前都需要取得该信号量,如果取不
到则永远等待,从而实现让取得信号量的任务一直执行到释放信号量
的地方。
***********************************************************************/
#define taskLock ()\
{\
semTake(taskLockMutexSem, WAIT_FOREVER);\
}\
#define taskUnLock (void)\
{\
semGive(taskLockMutexSem);\
}
#endif
#ifndef __MSG_Q__
/*****************************************************************************
删除一个消息队列
函数名 : msgQDelete()
功能 : 删除linux消息队列
参数 : msgQId 需要删除的消息队列的id
返回值: OK(0) 成功返回
ERROR(-1) 调用失败
******************************************************************************/
int msgQDelete
(
USE MSG_Q_ID msgQId /* message queue to delete */
);
/****************************************************************************
创建一个消息队列
函数名 : msgQCreate()
功能 : 创建一个linux消息队列
参数 : maxMsgs 消息队列可容纳的消息个数
maxMsgLength 单个消息的最大长度
options 未使用
返回值 : 消息队列的id(大于0) 成功返回
NULL(0) 调用失败
******************************************************************************/
MSG_Q_ID msgQCreate
(
USE int maxMsgs, /*最大消息个数*/
USE int maxMsgLength,/*单个消息最大长度*/
NO int options/*选项,linux未使用*/
);
/****************************************************************************
向linux消息队列发送消息
函数名 : msgQSend()
功能 : 向linux消息队列发送消息
参数 : msgQId 消息队列的id.
buffer 存有消息的缓冲区.
nBytes 发送缓冲中数据的长度.
timeout 发送的超时选项,可选值有二:
NO_WAIT :队列满时,不等待,立即返回错误.
WAIT_FOREVER:队列满时将阻塞,直到队列有空间.
注:如果传入值不在上面选项中,则认为是WAIT_FOREVER.
option 未使用
返回值 : OK(0) 成功发送
ERROR(-1) 调用失败
******************************************************************************/
int msgQSend
(
USE MSG_Q_ID msgQId, /* 队列id */
USE char * buffer, /* 发送缓冲 */
USE unsigned int nBytes, /* 缓冲区长度 */
USE int timeout, /* NO_WAIT(队列满时立即返回),
WAIT_FOREVER(队列满时将阻塞,直到队列有空间) */
NO int option /* 对于linux,该项无效*/
);
/****************************************************************************
从linux消息队列接收消息
函数名 : msgQReceive()
功能 : 从linux消息队列接收消息
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -