UCOSIII内嵌信号量
2024-10-20 03:46:29
不仅能够简化代码,而且比使用独立的信号量更有效
API函数
//等待-1
OS_SEM_CTR OSTaskSemPend (OS_TICK timeout,
OS_OPT opt,
CPU_TS *p_ts,
OS_ERR *p_err);
//取消等待
CPU_BOOLEAN OSTaskSemPendAbort (OS_TCB *p_tcb,
OS_OPT opt,
OS_ERR *p_err);
//释放+1
OS_SEM_CTR OSTaskSemPost (OS_TCB *p_tcb,
OS_OPT opt,
OS_ERR *p_err);
//设定值
OS_SEM_CTR OSTaskSemSet (OS_TCB *p_tcb,
OS_SEM_CTR cnt,
OS_ERR *p_err);
应用举例
void start_task(void *p_arg)
{
OS_CRITICAL_ENTER(); //进入临界区
//创建TASK1任务
OSTaskCreate((OS_TCB * )&Task1_TaskTCB,
(CPU_CHAR * )"Task1 task",
(OS_TASK_PTR )task1_task,
(void * )0,
(OS_PRIO )TASK1_TASK_PRIO,
(CPU_STK * )&TASK1_TASK_STK[0],
(CPU_STK_SIZE)TASK1_STK_SIZE/10,
(CPU_STK_SIZE)TASK1_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
//创建TASK2任务
OSTaskCreate((OS_TCB * )&Task2_TaskTCB,
(CPU_CHAR * )"Task2 task",
(OS_TASK_PTR )task2_task,
(void * )0,
(OS_PRIO )TASK2_TASK_PRIO,
(CPU_STK * )&TASK2_TASK_STK[0],
(CPU_STK_SIZE)TASK2_STK_SIZE/10,
(CPU_STK_SIZE)TASK2_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
OS_CRITICAL_EXIT(); //退出临界区
}
//任务1的任务函数
void task1_task(void *p_arg)
{
OS_ERR err;
u8 task1_str[]="First task Running!";
while(1)
{
OSTaskSemPost(&Task2_TaskTCB,OS_OPT_POST_NONE,&err); //使用系统内建信号量向任务task2发送信号量
printf("\r\n任务1:\r\n");
memcpy(share_resource,task1_str,sizeof(task1_str)); //向共享资源区拷贝数据
printf("%s\r\n",share_resource); //串口输出共享资源区数据
OSTimeDlyHMSM(0,0,3,0,OS_OPT_TIME_PERIODIC,&err); //延时10ms
}
}
//任务2的任务函数
void task2_task(void *p_arg)
{
OS_ERR err;
u8 task2_str[]="Second task Running!";
while(1)
{
OSTaskSemPend(0,OS_OPT_PEND_BLOCKING,0,&err); //请求任务内建的信号量
printf("\r\n任务2:\r\n");
memcpy(share_resource,task2_str,sizeof(task2_str)); //向共享资源区拷贝数据
printf("%s\r\n",share_resource); //串口输出共享资源区数据
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); //延时1s
}
}
实验现象
最新文章
- Linux设备管理(五)_写自己的sysfs接口
- Oracle中把一个DateTime的字符串转化成date类型。to_date('2016/12/8 18:55:43','yyyy/MM/dd hh24:mi:ss'),
- JavaScript学习笔记——对象基础
- 在View页面,使用@if(){ }输出判断正确的内容
- VC6.0和VS2010转换时经常遇到的问题
- Flash图表控件FusionCharts自定义图表y轴最大/最小值
- 【转】欧拉回路&;特殊图下的哈密顿回路题集
- ios打开系统自带APP
- 细说";回车";和";换行";的故事
- java中的static代码块为什么只执行一次
- 安装netcat(-bash: netcat: command not found)
- PIGS POJ - 1149(水最大流)
- Unity应用架构设计(1)—— MVVM 模式的设计和实施(Part 2)
- 【POJ1734】Sightseeing Trip 无向图最小环
- chrome 浏览器去掉输入框背景透明色
- linux文件和目录的删除、新建、移动等操作
- 查看django版本的方法
- Android手机提示“未安装应用程序”
- linux ping报错Name or service not known
- Math.floor,Math.ceil,Math.rint,Math.round用法
热门文章
- 无法反序列化的java.util.ArrayList实例出来VALUE_STRING的(Can not deserialize instance of java.util.ArrayList out of VALUE_STRING)
- [E2E_L9]GOMFCTemplate的融合进阶
- Leetcode: Find And Replace in String
- SpringBoot入门-概念(一)
- python初级(302) 3 easygui简单使用二
- SAP views
- preg_match 第三个参数,
- 并行执行任务 Stat-Job
- pipeline的添加顺序和执行顺序
- 【vim小记】自动保存配置