打印
[ZLG-ARM]

请教周工...

[复制链接]
1786|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
roseting|  楼主 | 2008-9-4 18:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST, LED, se, os, pi
我用的2131的开发板,用UCOS实现了基本的点亮LED的功能,想在此基础上加上一个task——数码管循环显示。不知道为什么加完数码管部分的程序之后就没有反映了,LED灯也不亮了。。。,请高人帮忙看看,下面是主程序,我没用操作系统时,用类似的程序实现了LED灯的循环点亮。


#include "config.h"
#include "stdlib.h"

#define LED1    (1<<18) 
#define LED2    (1<<19)
#define LED3    (1<<20)
#define HC595_CS (1<<29)

#define    Task0StkLengh    64            //Define the Task0 stack length 定义用户任务0的堆栈长度
#define TaskLED1StkSize 128
#define TaskLED2StkSize 128
#define TaskLED3StkSize 128
#define TaskNUMStkSize    128

OS_STK    Task0Stk [Task0StkLengh];        //Define the Task0 stack 定义用户任务0的堆栈
OS_STK    TaskLED1Stk[TaskLED1StkSize];
OS_STK    TaskLED2Stk[TaskLED2StkSize];
OS_STK    TaskLED3Stk[TaskLED3StkSize];
OS_STK    TaskNUMStk[TaskNUMStkSize];
void     Task0(void *pdata);            //Task0 任务0
void    TaskLED1(void *data);
void    TaskLED2(void *data);
void    TaskLED3(void *data);
void     TaskNUM(void *data);
//void    MSPI_Init( );
uint8     MSPI_SendData(uint8 data);

uint8 rcv_data;

uint8 const DISP_TAB[19]={
        0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
        0x88,0x83,0xC6,0xA1,0x86,0x8E,
        0xC7,0x8C,0xC6};
        
uint8 const LPC2131[7] ={0xC7,0x8C,0xC6,0xA4,0xF9,0xB0,0xF9};
        int main (void)
{
    OSInit ();    
//    MSPI_Init();                                                                                                        
    OSTaskCreate (Task0,(void *)0, &Task0Stk[Task0StkLengh - 1], 2);        
    OSStart ();
    return 0;                                                            
}
/*********************************************************************************************************
**                            Task0 任务0
********************************************************************************************************/

        void Task0    (void *pdata)
{
    pdata = pdata;
    TargetInit ();
    OSTaskCreate (TaskLED1,(void *)0, &TaskLED1Stk[TaskLED1StkSize - 1], 3);
    OSTaskCreate (TaskLED2,(void *)0, &TaskLED2Stk[TaskLED2StkSize - 1], 4);        
    OSTaskCreate (TaskLED3,(void *)0, &TaskLED3Stk[TaskLED3StkSize - 1], 5);
    OSTaskCreate (TaskNUM,(void *)0, &TaskNUMStk[TaskNUMStkSize - 1], 6);
    
    while (1)
    {
        OSTimeDly(10);
    }
}
 
/*********************************************************************************************************
**                            TaskLED1 任务LED1
********************************************************************************************************/
void TaskLED1(void *pdata)   
{
    pdata=pdata;
    PINSEL2=PINSEL2&(~0x08);
    IO1DIR|=LED1;
    IO1SET=LED1;
    
    for(;;)
    {
        IO1CLR=LED1;
        OSTimeDly(OS_TICKS_PER_SEC/4);
        IO1SET=LED1;
        OSTimeDly(OS_TICKS_PER_SEC/2);
    
    }
}

/*********************************************************************************************************
**                            TaskLED2 任务LED2
********************************************************************************************************/
void TaskLED2(void *pdata)   
{
    pdata=pdata;
    PINSEL2=PINSEL2&(~0x08);
    IO1DIR|=LED2;
    IO1SET=LED2;
    
    for(;;)
    {
        IO1CLR=LED2;
        OSTimeDly(OS_TICKS_PER_SEC/2);
        IO1SET=LED2;
        OSTimeDly(OS_TICKS_PER_SEC/1);
    
    }
}
/*********************************************************************************************************
**                            TaskLED3 任务LED3
********************************************************************************************************/
void TaskLED3(void *pdata)   
{
    pdata=pdata;
    PINSEL2=PINSEL2&(~0x08);
    IO1DIR|=LED3;
    IO1SET=LED3;
    
    for(;;)
    {
        IO1CLR=LED3;
        OSTimeDly(OS_TICKS_PER_SEC/1);
        IO1SET=LED3;
        OSTimeDly(OS_TICKS_PER_SEC*2);
    
    }
}
/*********************************************************************************************************
**                            TaskNUM 任务TaskNUM
********************************************************************************************************/
void TaskNUM(void *pdata)   
{    uint8 i;
    pdata=pdata;
    PINSEL0=0x00005500;
    PINSEL1=0x00000000;
    IO0DIR=HC595_CS;

    for(;;)
        {    for(i=0;i<16;i++)
                {
                rcv_data=MSPI_SendData(DISP_TAB);
                OSTimeDly(20);
                }
        }
}


/*********************************************************************************************************
**                            SPI SendData 任务SPI SendData
********************************************************************************************************/

uint8 MSPI_SendData(uint8 data)
{    
    PINSEL0=(PINSEL0&0xFFFF00FF)|0x00005500;
    SPI_SPCCR=0x52;
    SPI_SPCR=(0<<3)|
         (1<<4)|
         (1<<5)|
         (0<<6)|
         (0<<7);
    IO0CLR=HC595_CS;

    SPI_SPDR=data;
    while(0==(SPI_SPSR&0x80));
    IO0SET=HC595_CS;
    return(SPI_SPDR);
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

相关帖子

沙发
gavin_he| | 2008-9-4 18:13 | 只看该作者

看看配置参数

OS_MAX_TASKS           
OS_LOWEST_PRIO    

这两个参数有问题不  ?
    

使用特权

评论回复
板凳
roseting|  楼主 | 2008-9-4 18:23 | 只看该作者

应该没有问题的

#define OS_MAX_TASKS             11    /* Max. number of tasks in your application ...                 */
                                       /* ... MUST be >= 2                                             */

#define OS_LOWEST_PRIO           12    /* Defines the lowest priority that can be assigned ...         */
                                       /* ... MUST NEVER be higher than 63!                            */



使用特权

评论回复
地板
roseting|  楼主 | 2008-9-5 09:26 | 只看该作者

请周工帮我看看程序

谢谢...

使用特权

评论回复
5
zlg_lly| | 2008-9-8 12:16 | 只看该作者

RE:roseting

你好,很抱歉不能直接告诉你问题出在哪里,提几个建议,希望对你能有点帮助。
1、将SPI初始化函数从uint8 MSPI_SendData(uint8 data)中独立出来;
2、确认void TaskNUM(void *pdata)没有逻辑错误,先将其放到前后台系统中调试,调试通过后再放回到操作系统中调试;
3、在操作系统中减少任务个数进行调试,如:只留下void TaskNUM(void *pdata)任务;
4、增加系统任务个数进行调试。
调试程序是一个烦人的但又不得不循序渐进的过程,希望你能一步步前进,把整个程序拿出来让他人帮你解决问题是非常不利于自己进步的。

使用特权

评论回复
6
qjzcg| | 2008-9-8 15:00 | 只看该作者

问题出在这里

问题出在这里
  PINSEL0=0x00005500;
    PINSEL1=0x00000000;
正确的方法应该是:  PINSEL0=PINSEL0|0x00005500;
    PINSEL1=PINSEL1|0x00000000;

使用特权

评论回复
7
roseting|  楼主 | 2008-9-8 17:52 | 只看该作者

谢谢 zlg_lly

非常感谢,
从你提供的方法中,我找到了解决问题的方向,
我会努力的,加油+++

使用特权

评论回复
8
寒雨飞扬| | 2008-9-8 20:21 | 只看该作者

修改一下你的任务

首先我看到的是这个问题,没有仔细看你程序有没有逻辑错误。
uint8 MSPI_SendData(uint8 data)是一个典型的函数写法,但是操作系统的任务一般不建议这么写,首先任务是没有返回的,任务的入口参数也是一次有效的。

操作系统的任务一般这样写。
void MSPI_SendData(void *pdata)
{
      //初始化
      wile(1)
      {
           ;
      }
      
}
如果需要传递参数,最好使用消息。
仅供参考。

使用特权

评论回复
9
roseting|  楼主 | 2008-9-9 10:03 | 只看该作者

经过调试,发现下面的问题

经过调试,发现下面的问题:
OSTaskCreate (TaskLED1,(void *)0, &TaskLED1Stk[TaskLED1StkSize - 1], 3);
OSTaskCreate (TaskLED2,(void *)0, &TaskLED2Stk[TaskLED2StkSize - 1], 4);        
OSTaskCreate (TaskLED3,(void *)0, &TaskLED3Stk[TaskLED3StkSize - 1], 5);
OSTaskCreate (TaskNUM,(void *)0, &TaskNUMStk[TaskNUMStkSize - 1], 6);

仅有TaskNUM时,正常;
有LED1/LED2和TaskNUM三个任务时,正常;
LED1/LED2/LED3三个任务时,正常;
LED3和TaaskNUM两个任务一起时,正常
但是LED1/LED2/LED3和TaskNUM四个任务一起的时候就不正常.

这是为什么啊?我看了看,TaskNUM和LED3之间的操作是不会相互影响的,为什么会出现这样的结果?
本人刚学习ARM,对UCOS还不是很懂,请大侠指点~~


谢谢!

使用特权

评论回复
10
zlg_lly| | 2008-9-10 14:44 | 只看该作者

RE:roseting

你好!
“四个任务一起的时候就不正常”那就在任务创建时进行单步调试,观察OSTaskCreate的返回值,看看各任务是否成功建立。
可能内存已经溢出了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

71

帖子

1

粉丝