TA的每日心情 | 开心 2018-6-21 08:39 |
---|
签到天数: 8 天 连续签到: 2 天 [LV.3]偶尔看看II
|
接着打算移植FatFS了,但文件系统总是要绑定到某种存储设备上吧,目前开发板上可用的存储设备有RAM,Flash,SD卡和通过USB host扩展出mess storage。用RAM做ram disk除了调试外用处不大,USB又比较麻烦,可选的就是Flash和SD卡了。由于SD卡可以通过读卡器,很方便地在电脑验证文件系统是否正常,因此我选择在SD卡上mount FatFS。那就先实现一个小目标:在前面适配好FreeRTOS的基础上,支持SD卡的读写
野火自带的固件库例程中已经有了‘sdmmc—读写SD卡’的例程了,里面主要是新加了sdmmc目录,这个目录下的内容,其实就是sdk里面'sdk\middleware\sdmmc'目录下的内容,只有些许差别,可能是使用的代码和生成sdk时的版本不太一样吧
先找块SD卡,恰好手头有一块多年前替换下来的2G的MicroSD卡,在电脑上把它格式化了,插到mini板的SD卡槽,例程下到板子上跑一下看什么效果
有些乱码,根据代码看也就是对SD卡做了简单的读写测试,那我们的目标就是在前面的FreeRTOS工程上也做到一样的效果,支持SD卡的读写接口
1. 先参考sd卡的例程,将sdmmc目录和下面的文件拷贝到user目录下,并在工程中加入sdmmc组,以及添加相应的头文件路径
2. 对sd卡的测试代码在bsp_sd.c中,把这个文件也挪过来,同时加到工程的board组中
3. sd卡的例程中为了使能SD卡,在BOARD_InitPins中对IOMUX做了针对USDHC管脚的初始化,移植过来
4. board.h中也增加了对USDHC的pin和clock的一些定义,也挪过来
5. 最后将例程中调用SDCardTest的地方从main.c文件中挪到app.c中,通过新创建任务来执行
- int main(void)
- {
- /* Init board hardware. */
- BOARD_ConfigMPU();
- BOARD_InitPins();
- BOARD_BootClockRUN();
- BOARD_InitDebugConsole();
- if (xTaskCreate(hello_task, "Hello_task", configMINIMAL_STACK_SIZE + 10, NULL, hello_task_PRIORITY, NULL) != pdPASS)
- {
- PRINTF("Task creation failed!.\r\n");
- while (1)
- ;
- }
-
- #if 0
- /* debug console thread, simply counts seconds */
- xTaskCreate(vDebugConsoleTask, "vDebugConsole",
- configMINIMAL_STACK_SIZE, NULL, debugConsole_task_PRIORITY,
- (TaskHandle_t *) NULL);
- #else
- /* debug console thread, simply counts seconds */
- xTaskCreate(vSdcardTestTask, "vSdcardTest",
- configMINIMAL_STACK_SIZE, NULL, sdcardTest_task_PRIORITY,
- (TaskHandle_t *) NULL);
- #endif
- vTaskStartScheduler();
- for (;;)
- ;
- }
- extern void SDCardTest(void);
- /* sdcard test thread */
- static void vSdcardTestTask(void *pvParameters) {
- while (1) {
- SDCardTest();
- vTaskSuspend(NULL);
- }
- }
复制代码
一编译报错,报SysTick_Handler重复定义,仔细一看,原来例程中SD卡的读写使用的是polling方式,需要用SysTick_Handler中断来更新时戳信息,幸亏报了个错误,要不就糊里糊涂地用了低效的polling方式。。。既然用了RTOS,就应该用中断+event的方式提高效率,所以直接换成freertos目录下的fsl_sdmmc_event.c和fsl_sdmmc_host.c,这些都是sdk里已经写好的驱动了
这次编译正常,不过一运行挂死了,果然没那么顺利,用Keil调试,发现是调用了多次prvCheckTasksWaitingTermination之后,就mem异常了,好奇怪啊。。。
想起之前在PIC32上调uC/OS的时候,也是出调用函数多次后就莫名其妙的死机问题,后来跟踪了半天发现是任务栈太小导致的,这个不会也是把。。。我去,竟然忘记改SD卡测试任务的栈大小了,只有90个字节,可不要飞么,改到2048,同时把MemMang管理的内存大小扩大到16K,就都正常了
- xTaskCreate(vSdcardTestTask, "vSdcardTest",
- 2048, NULL, sdcardTest_task_PRIORITY,
- (TaskHandle_t *) NULL);
- #define configTOTAL_HEAP_SIZE ((size_t)(16 * 1024))
复制代码
这下在FreeRTOS下的SD卡驱动可以正常使用了下一步的工作就是把FatFS移植过来,把SD卡的读写接口挂接到FatFS的block read/write接口上
|
|