蔚明996 2024-05-13 10:55 采纳率: 0%
浏览 21

GD32303CEVAL官方例程SD卡驱动无法再Freertos中正常使用

GD32F303VCT6
GD32303CEVAL官方例程SD卡驱动无法再Freertos中正常使用

问题:SD卡相关驱动在进入Freertos前可以正常块读写,函数sd_block_write/sd_block_read返回SD_OK,在Freertos任务中无法正常读写,具体表现为返回SD_CMD_RESP_TIMEOUT

在单步调试中发现是一下代码片段导致返回SD_CMD_RESP_TIMEOUT



 align = blocksize & (blocksize - 1);
    if((blocksize > 0) && (blocksize <= 2048) && (0 == align)){
        datablksize = sd_datablocksize_get(blocksize);
        /* send CMD16(SET_BLOCKLEN) to set the block length */
        sdio_command_response_config(SD_CMD_SET_BLOCKLEN, (uint32_t)blocksize, SDIO_RESPONSETYPE_SHORT);
        sdio_wait_type_set(SDIO_WAITTYPE_NO);
        sdio_csm_enable();
        
        /* check if some error occurs */
        status = r1_error_check(SD_CMD_SET_BLOCKLEN);
        if(SD_OK != status){
            return status;
        }
    }else{
        status = SD_PARAMETER_INVALID;
        return status;
    }

以上片段摘自sdcard.c的sd_block_write函数中

在裸机中正常读写的代码如下


```c


int main()
{
    char str[50] = "";
    
    nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
    nvic_irq_enable(SDIO_IRQn, 0, 0);
    gpio_config();
    uart_config();
    tim7_init();
    gd_eval_lcd_init();
    sd_config();
    sd_error_enum sd_error;
    sd_error=sd_block_write(buff_write, 100*512, 512);
    printf("%d ",(int)sd_error);
    sd_error=sd_block_read(buff_read, 100*512, 512);
    printf("%d ",(int)sd_error);
    
    
    FreeRtos_Init();
    while (1)
    {
    }
}


在FreeRtos_init中会启动rtos

RTOS中读写失败代码如下

```c


void StartDefault_task(void *pvParameters)
{
    lcd_line_info info = {0};
    uint32_t index = 0;
    int time = 0;
    sd_error_enum sd_error;
    KeyInit();
    
    xTimerStart(hkeyTimer,0);
    for (;;)
    {
      portENTER_CRITICAL();
      sd_error=sd_block_write(buff_write, 100*512, 512);
      portEXIT_CRITICAL();
      printf("%d ",(int)sd_error);
      vTaskDelay(2000);
      portENTER_CRITICAL();
      sd_error=sd_block_read(buff_read, 100*512, 512);
      portEXIT_CRITICAL();
      printf("%d ",(int)sd_error);
      vTaskDelay(2000);
    }
}

现象如下

img

29是SD_OK,19是SD_CMD_RESP_TIMEOUT

可以看到进系统前返回SD_OK,而在任务中读取返回SD_CMD_RESP_TIMEOUT

可以帮我看看是什么原因吗,谢谢

  • 写回答

4条回答 默认 最新

  • 专家-皆知 2024-05-13 10:55
    关注

    检查SD卡驱动与FreeRTOS任务同步机制,确保线程安全。

    以上回复有部分引自免费微信小程序:皆我百晓生。 如问题尚未解决,还请稍待,如有疑问请回复进一步沟通。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月13日

悬赏问题

  • ¥15 pycharm添加远程解释器报错
  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口
  • ¥15 如何能达到用ping0.cc检测成这样?如图
  • ¥15 关于#DMA固件#的问题,请各位专家解答!
  • ¥15 matlab生成的x1图不趋于稳定,之后的图像是稳定的水平线
  • ¥15 请问华为OD岗位的内部职业发展通道都有哪些,以及各个级别晋升的要求
  • ¥20 微信小程序 canvas 问题
  • ¥15 系统 24h2 专业工作站版,浏览文件夹的图库,视频,图片之类的怎样删除?
  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照