希望能够得到各位前辈的指点。
我目前在使用SmartARM2200平台做一个仪器系统。我目前已经利用其扩展接口做了很多外接模块,现在进行系统综合时碰到一些问题。 我把ZLG/FS文件系统应用到SD卡上,对文件和目录的操作已经没有问题。 我利用SmartARM2200的USB模块,在电脑主机上,通过USB总线对ARM系统内的数据读写等也没有问题。 但是当我想通过USB总线操作SD卡文件时发现问题。
在ZLG/FS 中 osFile.c中有文件系统服务任务: void OSFileTask(void *pdata) { .........}
在 ZLG_USBD13中,D13Driver.c中有控制传输处理任务: void TaskSetup(void *pdata) { .......}
我发现当这两个任务同时启动时,USB接口就无法连接,个人觉得是两个任务彼此发生冲突,但是不知道为什么会发生冲突。 下面是我的main.c中的部分代码,希望哪位能够指点迷津。感兴趣的,我可以将我的整个工程文件传过来,:
#include "config.h" #include "D13Driver.h" #include "I2C.h"
#define PAGE_SIZE_CAT1025 16 #define CMD_READ_CAT1025 0x01 #define CMD_WRITE_CAT1025 0x02 #define CMD_READ_SD 0x06 #define CMD_WRITE_SD 0x07
OS_STK TaskStartStk[128]; OS_STK ReadTaskStk[256]; OS_STK WriteTaskStk[256]; OS_STK ReadSDTaskStk[256]; OS_STK WriteSDTaskStk[256]; OS_STK TaskStk[1024];
OS_EVENT *Write_Sem; OS_EVENT *Read_Sem; OS_EVENT *Read_SD_Sem; OS_EVENT *Write_SD_Sem;
void Init_I2CInt(void); INT16U Read_CAT1025(INT8U addr,INT8U offset,INT16U len,INT8U *recbuff); INT16U Write_CAT1025(INT8U addr,INT8U offset,INT16U len,INT8U *sendbuff);
void TaskStart(void *pdata); void TaskRead(void *pdata); void TaskWrite(void *pdata); void TaskReadSD(void *pdata); void TaskWriteSD(void *pdata);
extern void Usb_Handler(void);
char *strupr(char *Str) { char *cp; cp = Str; while (*cp != 0) { if (*cp >= 'a' && *cp <= 'z' ) { *cp -= 'a' - 'A'; } cp++; } return Str; }
*************************************************************/ void Init_D13Int(void) { VICVectCntl1 = (0x20 | 0x0E); VICVectAddr1 = (INT32U)Usb_Handler; VICIntEnable = 1 << 14; }
/*************************************************************/ int main (void) { OSInit(); OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[127], 5); OSStart(); }
/*************************************************************/ void TaskStart (void *pdata) { #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif INT8U err,cmd; pdata = pdata; TargetInit(); I2cInit(30000); Init_I2CInt(); Init_D13Int(); err = Init_D13(); Write_Sem = OSSemCreate(0); Read_Sem = OSSemCreate(0); Read_SD_Sem = OSSemCreate(0); Write_SD_Sem = OSSemCreate(0); OSTaskCreate(TaskRead, (void *)0, &ReadTaskStk[255], 1); OSTaskCreate(TaskWrite, (void *)0, &WriteTaskStk[255], 2); OSTaskCreate(TaskReadSD, (void *)0, &ReadSDTaskStk[255], 3); OSTaskCreate(TaskWriteSD,(void *)0, &WriteSDTaskStk[255], 4); OSTaskCreate(OSFileTask, (void *)0, &TaskStk[1023], 6); if (err == 0) OSTaskCreate(TaskSetup, (void *)0, &TaskSetupStk[127], 0); for (;;) { err = ReadPort1(1, &cmd, 200); if (err == OS_NO_ERR) { if (cmd == CMD_READ_CAT1025) OSSemPost(Read_Sem); if (cmd == CMD_WRITE_CAT1025) OSSemPost(Write_Sem); if (cmd == CMD_READ_SD) OSSemPost(Read_SD_Sem); if (cmd == CMD_WRITE_SD) OSSemPost(Write_SD_Sem); } } } ....... |