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灯滚动闪烁
TaskA,TaskB,TaskC永远进不去,请问是什么原因呢?,
一周热门 更多>