共2条
1/1 1 跳转至页
ucos 我的第一个ucos上程序,任务好像只运行了一遍,大侠帮忙看看
问
#include "config.h"
#include "stdlib.h"
#define TaskStkLengh 64 // 定义用户任务0的堆栈长度
#define UART_BPS 115200 /* 定义通讯波特率 */
OS_STK TaskStk [TaskStkLengh]; // 定义用户任务0的堆栈
OS_STK TaskStk1 [TaskStkLengh];
//OS_STK TaskStk2 [TaskStkLengh];
void Task0(void *pdata); //Task0 任务0
void Task1(void *pdata);
/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
* 入口参数:无
* 出口参数:无
****************************************************************************/
void UART0_Ini(void)
{ uint16 Fdiv;
U0LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
}
void UART0_SendByte(uint8 data)
{ U0THR = data; // 发送数据
while( (U0LSR&0x40)==0 ); // 等待数据发送完毕
}
int main (void)
{
OSInit ();
OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 0);
OSStart ();
return 0;
}
/*********************************************************************************************************
** Task0 任务0
********************************************************************************************************/
void Task0 (void *pdata)
{
UART0_Ini();
OSTaskCreate(Task1, (void *)0, &TaskStk1[TaskStkLengh-1], 10); /* 创建任务 */
for (;;)
{
UART0_SendByte(0x01);
OSTimeDlyHMSM(0, 0, 4, 0);///去掉这局,串口精灵只收到0x01
}
}
/*********************************************************************************************************
** Task1 任务1
********************************************************************************************************/
void Task1 (void *pdata)
{
UART0_Ini();
for (;;)
{
UART0_SendByte(0x02);
OSTimeDlyHMSM(0, 0, 2, 0);//去掉这局,串口精灵只收到0x02
}
}
那两句延时都加上的时候,在串口精灵上只收到一个0x01和0x02,好像没有再运行任务,怎么回事?任务之间是怎么切换的? 答 1: 程序是调出来的。单步执行一下不就知道问题在哪里了? 答 2: 定时器没有中断吧? 答 3: re两个任务都用到同一个资源,发生了冲突。 答 4: 非也能出来0x01,0x02,那说明能跑一次,只是不能继续
tigerzhou说的同一个资源是指? 答 5: 我又看了下书,要用信号量 答 6: 搞定了别忘了贴程序出来,让大家学习学习! 答 7: re treeslu同一资源是指串口0,两个任务都用串口发送数据,当优先级低的任务正在发送,优先级高的任务就绪,os切换到高优先级的任务。这时不能保证优先级低的任务发送正确完毕,此时,高优先级的任务又用串0口发送,造成发送错误,系统死锁。可以用互斥信号量解决之。
答 8: Re这个程序延时分别为4秒和2秒,但没有初始化系统时钟节拍,应该不是资源冲突, 答 9: 初始化系统时钟节拍用什么? 答 10: re 如果使用的是ARM Executable Image for UCOSII(for lpc2200), 那么要在
第一个任务的开始调用 TagetInit()来打开uCOS-II的时钟中断.
《ARM嵌入式系统实验教程(一)》实验4.2 就是一个串口0 中间件应用例子。
楼主两个任务都往串口发数据,但无保证每个任务数据发送完成,另一个任务才
发送数据. 建议认真阅读一下LPC2000串口的相关硬件说明及例程。
答 11: 加上TagetInit()运行正常
#include "stdlib.h"
#define TaskStkLengh 64 // 定义用户任务0的堆栈长度
#define UART_BPS 115200 /* 定义通讯波特率 */
OS_STK TaskStk [TaskStkLengh]; // 定义用户任务0的堆栈
OS_STK TaskStk1 [TaskStkLengh];
//OS_STK TaskStk2 [TaskStkLengh];
void Task0(void *pdata); //Task0 任务0
void Task1(void *pdata);
/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
* 入口参数:无
* 出口参数:无
****************************************************************************/
void UART0_Ini(void)
{ uint16 Fdiv;
U0LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
}
void UART0_SendByte(uint8 data)
{ U0THR = data; // 发送数据
while( (U0LSR&0x40)==0 ); // 等待数据发送完毕
}
int main (void)
{
OSInit ();
OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 0);
OSStart ();
return 0;
}
/*********************************************************************************************************
** Task0 任务0
********************************************************************************************************/
void Task0 (void *pdata)
{
UART0_Ini();
OSTaskCreate(Task1, (void *)0, &TaskStk1[TaskStkLengh-1], 10); /* 创建任务 */
for (;;)
{
UART0_SendByte(0x01);
OSTimeDlyHMSM(0, 0, 4, 0);///去掉这局,串口精灵只收到0x01
}
}
/*********************************************************************************************************
** Task1 任务1
********************************************************************************************************/
void Task1 (void *pdata)
{
UART0_Ini();
for (;;)
{
UART0_SendByte(0x02);
OSTimeDlyHMSM(0, 0, 2, 0);//去掉这局,串口精灵只收到0x02
}
}
那两句延时都加上的时候,在串口精灵上只收到一个0x01和0x02,好像没有再运行任务,怎么回事?任务之间是怎么切换的? 答 1: 程序是调出来的。单步执行一下不就知道问题在哪里了? 答 2: 定时器没有中断吧? 答 3: re两个任务都用到同一个资源,发生了冲突。 答 4: 非也能出来0x01,0x02,那说明能跑一次,只是不能继续
tigerzhou说的同一个资源是指? 答 5: 我又看了下书,要用信号量 答 6: 搞定了别忘了贴程序出来,让大家学习学习! 答 7: re treeslu同一资源是指串口0,两个任务都用串口发送数据,当优先级低的任务正在发送,优先级高的任务就绪,os切换到高优先级的任务。这时不能保证优先级低的任务发送正确完毕,此时,高优先级的任务又用串0口发送,造成发送错误,系统死锁。可以用互斥信号量解决之。
答 8: Re这个程序延时分别为4秒和2秒,但没有初始化系统时钟节拍,应该不是资源冲突, 答 9: 初始化系统时钟节拍用什么? 答 10: re 如果使用的是ARM Executable Image for UCOSII(for lpc2200), 那么要在
第一个任务的开始调用 TagetInit()来打开uCOS-II的时钟中断.
《ARM嵌入式系统实验教程(一)》实验4.2 就是一个串口0 中间件应用例子。
楼主两个任务都往串口发数据,但无保证每个任务数据发送完成,另一个任务才
发送数据. 建议认真阅读一下LPC2000串口的相关硬件说明及例程。
答 11: 加上TagetInit()运行正常
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |