HappyTime
HappyTime
This guy hasn't written anything yet

注册于 2 years ago

回答
276
文章
1
关注者
2

网上搜了一下

其实是使用GCC编译的问题。对GCC还是要多了解些。

修改STM32的固件库V3.5的core_cm3.c文件:

uint32_t __STREXB(uint8_t value, uint8_t *addr)
{
   uint32_t result=0;

   //__ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );//yiming del 2012.04.09
   __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );//yiming add 2012.04.09
   return(result);
}

uint32_t __STREXH(uint16_t value, uint16_t *addr)
{
   uint32_t result=0;

   //__ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );//yiming del 2012.04.09
   __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );//yiming add 2012.04.09
   return(result);
}

看这个是否可以呢

/* recursive search .mp3 file */
static void music_scan(char *path)
{
    DIR *dirp = RT_NULL;
    int len = 0;

    struct dirent *d = RT_NULL;
    struct stat sta;
    struct music *new;

    dirp = opendir(path);
    chdir(path);
    while((d = readdir(dirp)) != NULL)
    {
        stat(d->d_name,&sta);
        if(!(rt_strcmp(d->d_name,".") && rt_strcmp(d->d_name,"..")))
        {
            continue;
        }

        if(S_ISDIR(sta.st_mode))
        {
            music_scan(d->d_name);
        }

        len = rt_strlen(d->d_name);

        if(!(rt_strcmp(&d->d_name[len-4],".mp3")))
        {
            new = rt_calloc(1, sizeof(struct music));
            new->num = music_num++;
            rt_strncpy(new->mname, d->d_name, len);
            if (!getcwd(new->mpath, PATH_LEN))
            {
                LOG_E("get dir failed!");
            }
            rt_sprintf(new->mpath, "%s/%s",new->mpath, new->mname);
            rt_list_insert_before(&music, &new->list);
        }
    }
    closedir(dirp);

    /* back to the root dir */
    chdir("/");
}

参考这个代码,这是递归查找当前目录下所有的.mp3文件。换成你自己的逻辑就行了。

很明显,BSP_USING_I2C1 下面都是灰色的,说明没有地方定义这个宏。你需要在 board.h 中自己定义相应的宏和引脚配置。

/* recursive search .mp3 file */
static void music_scan(char *path)
{
    DIR *dirp = RT_NULL;
    int len = 0;

    struct dirent *d = RT_NULL;
    struct stat sta;
    struct music *new;

    dirp = opendir(path);
    chdir(path);
    while((d = readdir(dirp)) != NULL)
    {
        stat(d->d_name,&sta);
        if(!(rt_strcmp(d->d_name,".") && rt_strcmp(d->d_name,"..")))
        {
            continue;
        }

        if(S_ISDIR(sta.st_mode))
        {
            music_scan(d->d_name);
        }

        len = rt_strlen(d->d_name);

        if(!(rt_strcmp(&d->d_name[len-4],".mp3")))
        {
            new = rt_calloc(1, sizeof(struct music));
            new->num = music_num++;
            rt_strncpy(new->mname, d->d_name, len);
            if (!getcwd(new->mpath, PATH_LEN))
            {
                LOG_E("get dir failed!");
            }
            rt_sprintf(new->mpath, "%s/%s",new->mpath, new->mname);
            rt_list_insert_before(&music, &new->list);
        }
    }
    closedir(dirp);

    /* back to the root dir */
    chdir("/");
}

参考一下 art-pi-net-player 中扫描mp3文件的实现吧。

查看一下代码,是不是在读取数据的时候有线程让出。你自己没有写不代表没有。

楼主搜一下终端颜色代码,log相关的api最终会在打印的时候添加这些代码。

例子:
a = "033[41;34m %s 033[0m"
rt_kprintf(a)

41的位置是背景颜色,34的位置是字体颜色

背景颜色号
字背景颜色范围:40----49

40:黑
41:深红
42:绿
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色
字体颜色号
字颜色:30-----------39

30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色

ascii 控制码
33[0m 关闭所有属性
33[1m 设置高亮度
33[4m 下划线
33[5m 闪烁
33[7m 反显
33[8m 消隐
33[30m -- 33[37m 设置前景色
33[40m -- 33[47m 设置背景色
33[nA 光标上移n行
33[nB 光标下移n行
33[nC 光标右移n行
33[nD 光标左移n行
33[y;xH设置光标位置
33[2J 清屏
33[K 清除从光标到行尾的内容
33[s 保存光标位置
33[u 恢复光标位置
33[?25l 隐藏光标
33[?25h 显示光标

Automatically detecting the format is dangerous for raw images, write o

Specify the 'raw' format explicitly to remove the restrictions.

上面这个打印不是挂载失败的原因,是格式问题,一般不影响使用。

There is no space to register this file system (ram).
这个才是问题的原因,请设置dfs中相关的宏定义,使系统支持更多类型的文件系统。

查找到问题了,芯片内部自带的SDRAM不支持按字节操作。坑。

确实手册上给出的EXC_RETURN有效值

  • 0xFFFFFFF1
  • 0xFFFFFFF9
  • 0xFFFFFFFD

这个是不提供源码的。
社区有大佬做了一个RT-FOTA供参考。

一个是组件层,一个是具体的硬件。
rtt为了更方便的操作硬件,在这个基础上抽象出来了组件层,比如常用的pin操作 rt_pin_write 就是抽象出来的接口。
具体的 rt_pin_write 接口操作的硬件驱动就是你截图的硬件。
rt_pin_write 就是组件里的设备驱动层的内容。

发布
问题