战旗开发板上CoOS 操作系统实例(二)之多任务流水灯

2019-08-16 19:17发布

 CooCox CoOS 是一款针对ARM Cortex-M系列芯片而设计的实时系统内核。 CoOS特征:
  • 免费并开源
  • ARM Cortex M3及M0定制操作系统
  • 高度可裁剪性,最小系统内核仅974Byte
  • 支持优先级抢占和时间片轮转
  • 自适应任务调度算法
  • 中断延时时间趋近于零
  • 堆栈溢出检测
  • 信号量、邮箱、队列、事件标志、互斥等同步通信方式
  • 支持多种编译器:ICCARM、ARMCC、GCC

#include <CoOS.h>
#include "stm32f10x.h"
#include "usart.h" OS_STK taskA_stk[128];  //建立一个任务栈A
OS_STK taskB_stk[128];  //建立一个任务栈B
OS_STK taskC_stk[128];  //建立一个任务栈C
OS_FlagID FlagID1;  //定义事件标记用于串口输出TASK1
OS_FlagID FlagID2;  //定义事件标记用于串口输出TASK2
OS_MutexID mutex_dev;  //建立一个互斥体,例如:串口同一时间只能一个使用所以要使用互斥
volatile unsigned int Cnt=0; //定义一个Counter (volatile 防止编译器对代码进行优化) void LED_GPIO_Init(void)
{
 
 GPIO_InitTypeDef Weiqi_GPIO_InitStru;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,ENABLE);
 
 Weiqi_GPIO_InitStru.GPIO_Pin = GPIO_Pin_5;
 Weiqi_GPIO_InitStru.GPIO_Speed = GPIO_Speed_50MHz;
 Weiqi_GPIO_InitStru.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
 GPIO_Init(GPIOB,&Weiqi_GPIO_InitStru);
 
 Weiqi_GPIO_InitStru.GPIO_Pin = GPIO_Pin_5;
 Weiqi_GPIO_InitStru.GPIO_Speed = GPIO_Speed_50MHz;
 Weiqi_GPIO_InitStru.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
 GPIO_Init(GPIOE,&Weiqi_GPIO_InitStru);
 
  GPIO_SetBits(GPIOB,GPIO_Pin_5);
  GPIO_SetBits(GPIOE,GPIO_Pin_5);
 
}
void TaskA(void* pData)
{  for(;;)
 {
  CoWaitForSingleFlag(FlagID1,0);  //等待状态标志
  CoEnterMutexSection(mutex_dev);  //进入指定的互斥区域 
  GPIO_SetBits(GPIOB,GPIO_Pin_5);
  GPIO_ResetBits(GPIOE,GPIO_Pin_5);
  printf("TASK1 RUNNING... ");
  CoLeaveMutexSection(mutex_dev);  //离开指定的互斥区域 
 }
} void TaskB(void* pData)
{
 for(;;)
 {
  CoWaitForSingleFlag(FlagID2,0);  //等待状态标志
  CoEnterMutexSection(mutex_dev);  //进入指定的互斥区域 
  printf("TASK2 RUNNING... ");
  GPIO_SetBits(GPIOE,GPIO_Pin_5);
  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  CoLeaveMutexSection(mutex_dev);  //离开指定的互斥区域 
 }
} void TaskC(void* pData)
{
 for(;;)
 {
  CoTickDelay(200);
  if((Cnt%2)==0)
  {
   CoSetFlag(FlagID1);
  }
  else if((Cnt%2)==1)
  {
   CoSetFlag(FlagID2);
  }
  Cnt++;
 }
}   int main(void)
{
  SystemInit(); //初始化系统设置时钟为72Mhz
  
  LED_GPIO_Init();
  
  uart_init(9600);
  
  CoInitOS ();  //操作系统初始化   /*
  
     [IN1]创建任务的函数体
     [IN2]任务函数体的传入参数列表
     [IN3]任务优先级
     [IN4]任务栈起始地址
     [IN5]任务堆大小
  
  */
  
  CoCreateTask (TaskA,0,0,&taskA_stk[128-1],128); //创建任务A
  CoCreateTask (TaskB,0,1,&taskB_stk[128-1],128); //创建任务B
  CoCreateTask (TaskC,0,2,&taskC_stk[128-1],128); //创建任务C   mutex_dev = CoCreateMutex(); //创建一个互斥体
  if (mutex_dev == E_CREATE_FAIL)
  {
   printf("Create mutex fail. ");
  }
  FlagID1 = CoCreateFlag(1,0);  //自动重置事件标记,不可通知状态
  if(FlagID1 == E_CREATE_FAIL)
  {
   printf("Failed to create a flag1! ");
  }
  FlagID2 = CoCreateFlag(1,0);  //自动重置事件标记,不可通知状态
  if(FlagID2 == E_CREATE_FAIL)
  {
   printf("Failed to create a flag2! ");
  }
  
  CoStartOS ();  //启动操作系统开始多线程
  
  while (1);  //代码永远执行不到这里
}
实验现象:两个LED灯滚动闪烁


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。