VxWorks下消息、信号量的使用和任务创建

VxWorks下消息、信号量的使用和任务创建

[日期:2008-07-01]来源:  作者:[字体: ]
/****************************************************************************************************/

//test.c

#include <stdlib.h>
#include <stdio.h>

#include "test.h"
#include <tasklib.h>
#include <msgqlib.h>
#include <semlib.h>


#define max_message_count  100
#define max_message_length 400



int offset;
unsigned char sharedbuf[2*1024];


/*任务1   消息的发送*/
void loop1(msg_q_id id)/*the function for task 1, like a thread under Windows or unix*/
{
unsigned char msg[max_message_length] = {1};
for( ; ;)
{
  taskdelay(10);//快速发送消息,10ms,直至消息队列满
  if (msgqsend(id, msg, max_message_length, wait_forever, msg_pri_normal) == ok)
  {
   printf("longping1!!   send %d/n", msg[0]);
  }
  else
  {
   printf("sending message error!/n");
  }
}

}
/*任务2   消息的接收*/
void loop2(msg_q_id id)/*the function for test 2, like a thread under wondows or unix*/
{
unsigned char msg[max_message_length] = {0};
for( ; ;)
{
  taskdelay(30);//满速取消息,消息队列满了以后,收发达到平衡,发消息的10ms和30ms效果相同
  if (msgqreceive(id, msg, max_message_length, wait_forever) != error)
  {
   printf("looping2!! receive %d/n", msg[0]);
  }
  else
  {
   printf("receiving message error!/n");
  }
}

}
/*任务3          获取信号量,信号量减1操作*/
void loop3(sem_id semid)
{
for ( ; ;)
{
  taskdelay(100);//获取信号量,速度快
  if (semtake(semid, wait_forever) == ok)
  {
   offset = (++offset) % 2048;
   printf("looping3!!  take semid is: %d.now i get one element: %d/n", (int)semid, sharedbuf[offset]);
   
  }
}
}
/*任务4         释放信号量,信号量加1操作*/
void loop4(sem_id semid)
{
for ( ; ;)
{
  taskdelay(200);//释放信号量,速度慢,可以控制获取信号量,虽然获取延时短,但是没有释放信号量,只能等待
  if (semgive(semid) == ok)
  {
  
   printf("looping4!!  gave semid is: %d.now i get one element: %d/n", (int)semid, sharedbuf[offset]);
  }
}
}


void initialsharedbuf()
{
int i;
offset = 0;
for (i=0; i<2048; i++)
{
  sharedbuf = i;
}
}

int main()
{

msg_q_id msgid;
sem_id semid;
signed int taskarray[100] = {0};
char ch;
int i;
/*to build a message queue.*/
initialsharedbuf();
msgid = msgqcreate(max_message_count, max_message_length, msg_q_fifo);
semid = sembcreate(sem_q_fifo, sem_full);

/*下面启动4个任务*/
/*start a task(thread)*/
taskarray[0] = taskspawn("loop1 ", 80, 0, 64*1024, (funcptr)loop1, (msg_q_id)msgid, 0, 0, 0, 0, 0, 0, 0, 0, 0);
/*start another task(thread)*/
taskarray[1] = taskspawn("loop2 ", 80, 0, 64*1024, (funcptr)loop2, (msg_q_id)msgid, 0, 0, 0, 0, 0, 0, 0, 0, 0);

/*start another task(thread)*/
taskarray[2] = taskspawn("loop3 ", 80, 0, 64*1024, (funcptr)loop3, (sem_id)semid, 0, 0, 0, 0, 0, 0, 0, 0, 0);

/*start another task(thread)*/
taskarray[3] = taskspawn("loop4 ", 80, 0, 64*1024, (funcptr)loop4, (sem_id)semid, 0, 0, 0, 0, 0, 0, 0, 0, 0);

/*主任务循环,当接收到'e'结束所有任务*/
for ( ; ;)
{
  ch = getchar();
  if (ch == 'e')
  {
   i = 0;
   while (taskarray)
   {
    taskdelete(taskarray);
    printf("the task: %d is ended./n", taskarray);
    taskarray = 0;
    i ++;
   }
   break;
  }
}


printf("the main function is ended./n");
return 0;
}

/**************************************************************************************/

上面演示了消息、信号量和任务的创建,在tornado下编译调试过,没有问题。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值