因为项目要用到文件系统,虽然不完备,也可以拓展成为一种调试手段吧!

 

UCOS3-3.03  FATFS0.12B 

console.c

处理命令。   文件夹切换  ../ 暂时没搞定

  1 void CONSOLE_task()
  2 {
  3     OS_ERR err;    
  4     u8 rs=0,tp=0,i=0;
  5     /*获取串口1的使用权*/
  6     OSMutexPend (&USART1_MUTEX,0,OS_OPT_PEND_BLOCKING,0,&err);    
  7     /*将IN_FIFO 指向 Console_IN_fifo*/
  8     usart1infifo = Console_IN_fifo;
  9     Console_FIFO_Init();
 10     /*删除任务时候调用*/
 11     //    OSMutexPost(&USART1_MUTEX,OS_OPT_POST_NONE,&err);            //释放互斥信号量
 12     for(;;)
 13     {        
 14         /*等待串口中断信号量*/
 15         OSSemPend(&USART1_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量        
 16         if(Console_OUT_fifo(&rs))
 17         {
 18             if(rs=='\n' || rs=='\r')
 19             {
 20                 tp++;
 21             }
 22             /*退格,如果显示终端支持*/
 23             else if(rs == '\b')
 24             {
 25                 tp = 0;
 26                 if(i>0)
 27                 {
 28                     uart1_cmd[--i] = 0;
 29                 //    USART1_sendonebyte(0x08);
 30                 }
 31                 
 32             }
 33             else
 34             {
 35                 tp = 0;
 36                 if(i<CMD_BUFFER_SIZE)uart1_cmd[i++] = rs;
 37             }
 38             /*回显*/
 39             USART1_sendonebyte(rs);
 40         }    
 41         if(tp>1)
 42         {
 43             tp=0;
 44             /*添加终止符*/
 45             if(i<CMD_BUFFER_SIZE)uart1_cmd[i++] = '\0';
 46             i = 0;    
 47             Cmd_process(uart1_cmd);            
 48         }        
 49         
 50         
 51     }
 52     
 53 }
 54 /*
 55 命令处理
 56 */
 57 u8 Cmd_process(char *msg)
 58 {
 59     FRESULT res;
 60     uint8_t i=0;
 61     char *par[3];
 62     if(msg[0] == '\0')
 63     {
 64         printf("\r\n%s>",NOW_DIR);
 65         return 0;
 66     }
 67     i=0;
 68     par[i] = strtok(msg," ");
 69     for(i=1;i<4;i++)
 70     {
 71         par[i] = strtok(NULL," ");
 72         if(par[i] == NULL) break;
 73     }
 74     if(par[0] != NULL)
 75     {
 76         /*切换目录  不支持../ 我没写出来*/
 77         if(0==strcmp(par[0],"cd"))
 78         {
 79             res = cmd_cd(par[1]);
 80             if(res != FR_OK)
 81             {
 82                 printf("Err:%s",fresult[res]);
 83             }                
 84         }
 85         /*当前目录*/
 86         else if(0==strcmp(par[0],"pwd"))
 87         {
 88             printf("%s",NOW_DIR);
 89         }
 90         /*当前目录下的文件列表*/
 91         else if(0==strcmp(par[0],"ls"))
 92         {
 93             res = cmd_ls(NOW_DIR);
 94             if(res != FR_OK)
 95             {
 96                 printf("Err:%s",fresult[res]);
 97             }                
 98         }
 99         /*新建文件夹*/
100         else if(0==strcmp(par[0],"mkfs"))
101         {            
102             res = f_mkdir(par[1]);
103             if(res != FR_OK)
104             {
105                 printf("Err:%s",fresult[res]);
106             }
107             
108         }
109         /*格式化磁盘*/
110         else if(0==strcmp(par[0],"format"))//
111         {            
112             res=f_mkfs("0",FM_ANY,0,FileSystemWorkbuf,4096);
113             SetNowWorkDir("/");
114             if(res != FR_OK)
115             {
116                 printf("Err:%s",fresult[res]);
117                 
118             }            
119         }    
120         /*读取文件    read  文件名        */
121         else if(0==strcmp(par[0],"read"))            
122         {
123             res = cmd_read(par[1]);    
124             if(res != FR_OK)
125             {
126                 printf("Err:%s",fresult[res]);
127             }                
128         }
129         /*写文件      write  文件名   内容  */
130         else if(0==strcmp(par[0],"write"))            
131         {
132             res = cmd_write(par[1],par[2])    ;
133             if(res != FR_OK)
134             {
135                 printf("Err:%s",fresult[res]);
136             }                
137         }
138         /*删除文件或子目录  del  名称*/
139         else if(0==strcmp(par[0],"del"))            
140         {
141              res = cmd_del(par[1])    ;
142             if(res != FR_OK)
143             {
144                 printf("Err:%s",fresult[res]);
145             }                
146         }            
147         else
148         {
149             printf("unknow cmd");                
150         }
151         
152         printf("\r\n%s>",NOW_DIR);
153     }
154     return 1;
155 }
156 
157 /*
158 切换目录
159 最多10级目录
160 目录总长度不能超过255
161 */
162 char t_dir[255];
163 FRESULT cmd_cd(char *path)
164 {
165     DIR dir;
166     FRESULT res;
167     if(path[0] == '/')
168     {
169         strcpy(t_dir,path);
170     }
171     else
172     {
173         strcpy(t_dir,NOW_DIR);
174         strach(t_dir,'/');
175         strcat(t_dir,path);        
176     }
177     
178 
179     res = f_opendir(&dir,t_dir);
180     if(res == FR_OK)
181     {
182         f_closedir(&dir);
183 
184         SetNowWorkDir(t_dir);
185     }
186     return res;
187 }
188 /*
189 显示当前文件夹下的 文件名 和文件夹名
190 */
191 FRESULT cmd_ls(char *path)
192 {
193     FRESULT res;    
194     DIR dir;
195     static FILINFO fno;
196     UINT i=0;
197     res = f_opendir(&dir,path);
198     if(res == FR_OK)
199     {
200         while(1)
201         {
202             res = f_readdir(&dir,&fno);
203             if(res!= FR_OK || fno.fname[0] == 0)break;
204             if(fno.fattrib&AM_DIR)
205             {
206                 i++;
207                 printf("%s/    ",fno.fname);
208                 if(i%3==0)
209                 {
210                     printf("\r\n");
211                 }
212             }
213             else
214             {
215                 i++;
216                 printf("%s    ",fno.fname);
217                 if(i%3==0)
218                 {
219                     printf("\r\n");
220                 }                
221             }
222             
223         }    
224         f_closedir(&dir);
225     }
226     return res;
227     
228 }
229 
230 
231 FRESULT cmd_read(char *path)
232 {
233     FRESULT res;
234     FIL *fp;
235     UINT bw;
236     uint8_t i, *read_buf;
237 //    int size;
238     fp=(FIL*)mymalloc(SRAMIN,sizeof(FIL));
239     read_buf=(u8*)mymalloc(SRAMIN,128);
240     
241     strcpy(t_dir,NOW_DIR);
242     strach(t_dir,'/');
243     strcat(t_dir,path);
244     res = f_open(fp,t_dir, FA_READ );//
245     if(res == FR_OK)
246     {
247 //        size = f_size(fp);
248         do
249         {
250             res = f_read(fp,read_buf,128,&bw);
251             for(i=0;i<bw;i++)
252             {
253                 USART1_sendonebyte(read_buf[i]);
254             }            
255         }while(bw==128);                                
256         
257         f_close(fp);
258     }
259     myfree(SRAMIN,fp);    
260     myfree(SRAMIN,read_buf);
261     
262     return res;
263 }
264 
265 FRESULT cmd_write(char *path,char *data)
266 {
267     FRESULT res;
268     FIL *fp;
269 //    UINT bw;
270 //    int size;
271     fp=(FIL*)mymalloc(SRAMIN,sizeof(FIL));
272 
273     strcpy(t_dir,NOW_DIR);
274     strach(t_dir,'/');
275     strcat(t_dir,path);    
276     res = f_open(fp,t_dir,FA_CREATE_ALWAYS|FA_READ | FA_WRITE);
277     if(res == FR_OK)
278     {
279 //        size = f_size(fp);
280 //        bw = f_puts(data,fp);
281         f_puts(data,fp);
282         f_close(fp);
283     }
284     myfree(SRAMIN,fp);        
285     return res;
286 }
287 
288 FRESULT cmd_del(char *path)
289 {
290     FRESULT res;
291 
292     strcpy(t_dir,NOW_DIR);
293     strach(t_dir,'/');
294     strcat(t_dir,path);    
295     
296     res = f_unlink(t_dir);
297         
298     return res;
299 }
300 
301 
302 /*任务 buf*/
303 #define  CONSOLE_BUF_SIZE   256
304 static uint8_t  ConsoleRXBuf[CONSOLE_BUF_SIZE];
305 static uint16_t p_head, p_tail,data_long;
306 void  Console_FIFO_Init(void)
307 {
308     uint16_t i;
309     p_head = CONSOLE_BUF_SIZE-1;
310     p_tail = 0;
311     data_long=0;
312     for(i=0;i<CONSOLE_BUF_SIZE;i++)
313     {
314         ConsoleRXBuf[i]=0;
315     }
316 }
317 void  Console_FIFO_Clear(void)
318 {
319     p_head = CONSOLE_BUF_SIZE-1;
320     p_tail = 0;
321     data_long=0;
322 }
323 
324 u8 Console_IN_fifo(uint8_t data)
325 {
326     uint8_t pos;
327     pos=(p_tail+1)%CONSOLE_BUF_SIZE;
328     if(p_head!=pos)
329     {
330         ConsoleRXBuf[p_tail] = data;
331         p_tail=pos;
332         data_long++;
333         return 1;
334     }
335     return 0;
336 }
337 /*
338     有数据返回1
339     没数据返回0
340 */
341 uint8_t  Console_OUT_fifo(uint8_t *data)
342 {
343     uint8_t pos;
344     pos=(p_head+1)%CONSOLE_BUF_SIZE;
345     if(p_tail!=pos)
346     {
347         *data = ConsoleRXBuf[pos];
348         p_head=pos;
349         data_long--;
350         return 1;
351     }
352     return 0;
353 }
View Code

问题还是比较多的额。

运行结果

有机会在完善吧!