因为项目要用到文件系统,虽然不完备,也可以拓展成为一种调试手段吧!
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 }
问题还是比较多的额。
运行结果
有机会在完善吧!