这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » ucos 我的第一个ucos上程序,任务好像只运行了一遍,大侠帮忙看看

共2条 1/1 1 跳转至

ucos 我的第一个ucos上程序,任务好像只运行了一遍,大侠帮忙看看

院士
2006-09-17 18:14:16     打赏
ucos 我的第一个ucos上程序,任务好像只运行了一遍,大侠帮忙看看



关键词: 我的     第一个     程序     任务     好像     行了     一遍     大侠         

院士
2006-12-22 22:43:00     打赏
2楼
问 #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()运行正常

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]