我用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);
}
|