现在还不清楚音讯邮箱和音讯行列的差异,形似音讯行列是音讯邮箱的调集?不太清楚。
环境:STM32F107VC 72M主频
1:主函数:
int main(void)
{
BspInit();//初始化硬件并使能 SysTick 定时器
OSInit(); //有必要调用,树立两个使命 闲暇使命和计算使命
OSTaskCreate(TaskStart,(void *)0,&start_task_stk[START_TASK_STK_SIZE-1], START_TASK_PRIO); //树立使命
OSStart();//将控制权交给ucos,开端运转多使命
return 0;
}:
2:先看一下初始化硬件和Systick函数
//初始化硬件
void BspInit(void)
{
SystickInit();//初始化并使能Systicks
LedConfig();//初始化开发板的LED
DS18B20_Init();
USART1NVICInit();//初始化串口
}
//初始化并使能Systicks
void SystickInit(void)
{
SysTick_Config(SystemCoreClock/OS_TICKS_PER_SEC);//初始化并使能 SysTick 定时器
}
这儿最重要的便是SysTick_Config函数了,他界说了UCOS的时钟节拍,OS_TICKS_PER_SEC宏界说说明晰每一秒钟有多少个节拍。
3:然后看一下初始创立的使命函数
void TaskStart(void *pdata)
{
pdata=pdata;//避免编译器正告
MsgQueue=OSQCreate(&MsgQueueTbl[0],MSG_QUEUE_SIZE); //树立音讯行列
OSTaskCreate(TaskLED1,(void *)0,&led1_task_stk[LED1_TASK_STK_SIZE-1], LED1_TASK_PRIO); //树立使命LED1
OSTaskCreate(TaskDS18B20,(void *)0,&DS18B20_task_stk[DS18B20_TASK_STK_SIZE-1], DS18B20_TASK_PRIO); //树立使命读取Ds18b20
OSTaskCreate(TaskUsart1Tx,(void *)0,&Usart1Tx_task_stk[Usart1Tx_TASK_STK_SIZE-1], Usart1Tx_TASK_PRIO); //树立使命串口1发送Ds18b20数据
while(1)//一切的使命都是一个死循环
{
OSTimeDlyHMSM(0, 0,0,500); //延时500ms
}
}
这儿创立了3个使命,第一个使命是LED闪耀,第二个使命是温度收集,第三个使命是串口通讯,传输收集的温度。而且创立了音讯行列。
4:首要看一下使命2和使命3,使命2收集温度值之后,向音讯行列发送音讯。使命3等候接纳音讯行列的音讯,只需接纳到音讯就向串口发数据。使命2的延时时刻为3s,因而也便是3s发送一条音讯,因而使命3也是3s收到一条音讯,然后串口输出。闪现便是串口3s发送一次数据。
//在Taskstart中树立Ds18b20温度收集使命
void TaskDS18B20(void *pdata)
{
pdata=pdata;//避免编译器正告
while(1)
{
MyResault.Ds18b20Resault=DS18B20_Get_Temp();//获取温度值
OSQPost(MsgQueue,(void *)&MyResault.Ds18b20Resault);//向音讯行列发送一条音讯 发送的是转化的温度值
OSTimeDlyHMSM(0, 0,3,0); //延时3s
}
}
//在Taskstart中树立串口1发送使命
void TaskUsart1Tx(void *pdata)
{
uint16_t * Ds18b20Resault;
uint8_t err=0;
uint8_t Ds18b20ResaultH=0;//温度值高8位
uint8_t Ds18b20ResaultL=0;//温度值低8位
pdata=pdata;//避免编译器正告
while(1)
{
Ds18b20Resault=(uint16_t *)OSQPend(MsgQueue,0,&err);// 等候音讯行列的音讯
Ds18b20ResaultH=(*Ds18b20Resault)/256;//取高8位
Ds18b20ResaultL=(*Ds18b20Resault)%256;//取低8位
Usart1SendArray(&Ds18b20ResaultH,1);//串口发送数据
Usart1SendArray(&Ds18b20ResaultL,1);//串口发送数据
OSTimeDlyHMSM(0, 0,0,500); //延时500ms
}
}