不仅能够简化代码,而且比使用独立的信号量更有效

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
}
}

实验现象

最新文章

  1. Linux设备管理(五)_写自己的sysfs接口
  2. Oracle中把一个DateTime的字符串转化成date类型。to_date('2016/12/8 18:55:43','yyyy/MM/dd hh24:mi:ss'),
  3. JavaScript学习笔记——对象基础
  4. 在View页面,使用@if(){ }输出判断正确的内容
  5. VC6.0和VS2010转换时经常遇到的问题
  6. Flash图表控件FusionCharts自定义图表y轴最大/最小值
  7. 【转】欧拉回路&特殊图下的哈密顿回路题集
  8. ios打开系统自带APP
  9. 细说"回车"和"换行"的故事
  10. java中的static代码块为什么只执行一次
  11. 安装netcat(-bash: netcat: command not found)
  12. PIGS POJ - 1149(水最大流)
  13. Unity应用架构设计(1)—— MVVM 模式的设计和实施(Part 2)
  14. 【POJ1734】Sightseeing Trip 无向图最小环
  15. chrome 浏览器去掉输入框背景透明色
  16. linux文件和目录的删除、新建、移动等操作
  17. 查看django版本的方法
  18. Android手机提示“未安装应用程序”
  19. linux ping报错Name or service not known
  20. Math.floor,Math.ceil,Math.rint,Math.round用法

热门文章

  1. 无法反序列化的java.util.ArrayList实例出来VALUE_STRING的(Can not deserialize instance of java.util.ArrayList out of VALUE_STRING)
  2. [E2E_L9]GOMFCTemplate的融合进阶
  3. Leetcode: Find And Replace in String
  4. SpringBoot入门-概念(一)
  5. python初级(302) 3 easygui简单使用二
  6. SAP views
  7. preg_match 第三个参数,
  8. 并行执行任务 Stat-Job
  9. pipeline的添加顺序和执行顺序
  10. 【vim小记】自动保存配置