OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4679|回复: 6

急!!!!uCOSII多任务问题~~~

[复制链接]

10

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2012-6-7
在线时间
0 小时
发表于 2014-1-6 14:28:17 | 显示全部楼层 |阅读模式

我用stm32f103ze,在UCOSII下,实现PWM(频率3KHZ)控制ad采样,采完后,送nandflash存储,再送sd卡存储。优先级应该是ad>nandflash>sd,这样程序只是在ad里走,跳不出去了。如果优先级变为黄色标注的ad<nandflash>sd,程序才能运行。实际测得ad采样可以和nandflash存储同步,但sd存储不能同步。求大侠指点
程序部分代码:
//START 任务
#define START_TASK_PRIO         10     //设置任务优先级,开始任务的优先级设置为最低
#define START_STK_SIZE      2048    //设置任务堆栈大小
OS_STK START_TASK_STK[START_STK_SIZE];         //任务堆栈 
void start_task(void *pdata);                //任务函数
      
//ADC任务
#define ADC_TASK_PRIO          6
#define ADC_STK_SIZE          2048
OS_STK ADC_TASK_STK[ADC_STK_SIZE];
void adc_task(void *pdata);

//NandFlash任务
#define NANDFLASH_TASK_PRIO         3
#define NANDFLASH_STK_SIZE     2048
OS_STK NANDFLASH_TASK_STK[NANDFLASH_STK_SIZE];
void nandflash_task(void *pdata);

//SD任务
#define SD_TASK_PRIO         4
#define SD_STK_SIZE     2048
OS_STK SD_TASK_STK[SD_STK_SIZE];
void sd_task(void *pdata);

//声明信号量
OS_EVENT *Sem_Event,*Sem_Event1;
OS_SEM_DATA result[];
u8 err;

//开始任务
void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;
 pdata = pdata;
   OS_ENTER_CRITICAL();  //进入临界区(无法被中断打断)
     
  OSTaskCreate(adc_task,(void *)0,(OS_STK*)&ADC_TASK_STK[ADC_STK_SIZE-1],ADC_TASK_PRIO);        
  OSTaskCreate(nandflash_task,(void *)0,(OS_STK*)&NANDFLASH_TASK_STK[NANDFLASH_STK_SIZE-1],NANDFLASH_TASK_PRIO);
 OSTaskCreate(sd_task,(void *)0,(OS_STK*)&SD_TASK_STK[SD_STK_SIZE-1],SD_TASK_PRIO);
  OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
 OS_EXIT_CRITICAL();    //退出临界区(可以被中断打断)
}
//任务1
void adc_task(void *pdata)

    u8 i=0;
    u16 cnt=0;  
 while(1)
 {
  if(DMA_GetFlagStatus(DMA1_FLAG_TC1)==SET)
     {
      //存ad转换数据
       if(.....)
       { 
           cnt = 0;
          flag=3;
     OSSemPost(Sem_Event);
     OSSemPost(Sem_Event1);
   }
   else if(....)
   {    flag=2;
     OSSemPost(Sem_Event);
     OSSemPost(Sem_Event1);
   }
   else if(....)
   { 
    flag=1;
    OSSemPost(Sem_Event);
    OSSemPost(Sem_Event1);
   }
   else
     flag=0;
     delay_us(100);
    }
      
  
 };
}
//任务2
void nandflash_task(void *pdata)
{   
 while(1)
 {
    OSSemPend(Sem_Event,0,&err); //请求信号量,若信号量有效(cnt>0),那么任务继续运行,否则进入等待状态
    if(flag==1)
    {
    sta= FSMC_NAND_WriteSmallPage(TxBuffer,WriteReadAddr, PageNumber);

     }
    else if(flag==2)
    {
    sta = FSMC_NAND_WriteSmallPage(TxBuffer, WriteReadAddr, PageNumber);
    }
    else if(flag==3)
    {
    sta = FSMC_NAND_WriteSmallPage(TxBuffer, WriteReadAddr, PageNumber);
    }
           。。。。。
          delay_us(10);

 };
}
//任务3
void sd_task(void *pdata)

  while(1)
 {
   OSSemPend(Sem_Event1,0,&err); //请求信号量,若信号量有效(cnt>0),那么任务继续运行,否则进入等待状态
    if(flag==1)
   {
        res=f_write(&f_test,TxBuffer,512,&bw);
     }
     else if(flag==2)
     {
        res=f_write(&f_test,TxBuffer,512,&bw);
     }
     else if(flag==3)
     {
        res=f_write(&f_test,TxBuffer,512,&bw);
     }
      
     } 
  
 };  f_close(&f_test);


}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-1-6 20:54:18 | 显示全部楼层
你把sd_task和nandflash_task里面的写操作部分代码全部去掉,只留下信号量请求,并加入一些点灯操作,来测试下,是ucosii使用的问题,还是你读写操作的问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2012-6-7
在线时间
0 小时
 楼主| 发表于 2014-1-8 09:09:53 | 显示全部楼层
回复【2楼】正点原子:
你把sd_task和nandflash_task里面的写操作部分代码全部去掉,只留下信号量请求,并加入一些点灯操作,来测试下,是ucosii使用的问题,还是你读写操作的问题。
---------------------------------
原子哥,我按你说的做了一下试验,是SD写的问题,SD写时间太长了,  我想往SD卡里写2048个字节,分四次写的,一次写512字节,
部分代码:
if(flag==1)
   {
       for(i=0;i<4;i++)
        res=f_write(&f_test,TxBuffer+i*512,512,&bw);
     }
.......
其中,TxBuffer[2048]
怎么才能减少SD写时间啊?我换一个高速卡试试吗?
回复 支持 反对

使用道具 举报

10

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2012-6-7
在线时间
0 小时
 楼主| 发表于 2014-1-8 09:55:14 | 显示全部楼层
回复【2楼】正点原子:
--------------------------
原子哥,我改变SD的时钟频率能提高SD的写速率吗?我现在测得SD写速度是144kb/s
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-1-8 10:57:10 | 显示全部楼层
回复【4楼】lvjie8889:
---------------------------------
SPI模式?
SPI模式差不多就这速度了.
看你的卡,用SDHC,最快可以上到200KB左右.
卡不好就100多KB,甚至更低.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2012-6-7
在线时间
0 小时
 楼主| 发表于 2014-1-8 14:01:56 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
是SDIO模式 4bit,DMA,有没有什么好的方法能提高sd写速率?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-1-8 18:27:38 | 显示全部楼层
回复【6楼】lvjie8889:
---------------------------------
已经是SDIO模式了?那确实有点慢,呵呵.
有人提过USB双缓冲模式,你可以试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 19:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表