嵌入式技术论坛
直播中

刘艳

7年用户 2320经验值
私信 关注
[问答]

请问os_spiflash_lock函数是在什么情况下被调用的?

我用ab32vg1的开发板,BSP版本1.1.0,rt-thread版本laster(4.1.0),创建项目。更改使用uart1打印,波特率115200。 点灯程序能够正常运行。

开启板载设备驱动Enable SDCARD,正常挂载tf卡,能够读出文件。测试时,tf卡内有文件t1.txt,采用cat t1.txt,正常输出。在终端使用cp命令拷贝文件,或输入 echo “hello” t2.txt 时出错,提示:

Function[rt_mutex_take]: scheduler is not available
(0) assertion failed at function:rt_mutex_take, line number:921“
如果开启audio device硬件,同时使能WavPlayer包,无法开机,提示:

\ | /

RT - Thread Operating System
/ | \ 4.1.0 build Jun 24 2022 13:40:56
2006 - 2022 Copyright by RT-Thread team
Function[rt_mutex_take]: scheduler is not available
(0) assertion failed at function:rt_mutex_take, line number:921
通过打印跟踪,初步判定是卡在board.c的void os_spiflash_lock(void)函数中的rt_mutex_take(&mutex_spiflash, RT_WAITING_FOREVER);

请问os_spiflash_lock函数是在什么情况下被调用的?这颗芯片是内置spi flash,然后程序加载到cache运行的吗?

这个BSP能否适配最新版本的rt-thread?

大家有没有遇到过类似的问题,是如何解决的?

回帖(4)

刘军

2023-2-13 13:53:24
mutex lock 必须在线程环境下运行。
举报

刘艳

2023-2-13 13:53:32
修改Board.c中os_spiflash_lock和os_spiflash_unlock两个函数,增加rt_critical_level的判断。现在TF卡和音频功能都正常的,暂时没有发现问题。
这个芯片的资料极度不完整,spiflash感觉像是内部flash的操作用到,貌似碰到问题还要用猜的?
有没有哪位大神解释下,以下函数的功能和使用条件相关的限制要求。

void os_spiflash_lock(void);
void os_spiflash_unlock(void);
void os_cache_lock(void);
void os_cache_unlock(void);
RT_SECTION(".irq.cache")
void os_spiflash_lock(void)
{
    if ((rt_thread_self() != RT_NULL) && (rt_interrupt_nest == 0) && (rt_critical_level() == 0))
    {
        rt_mutex_take(&mutex_spiflash, RT_WAITING_FOREVER);
    }
}
RT_SECTION(".irq.cache")
void os_spiflash_unlock(void)
{
    if ((rt_thread_self() != RT_NULL) && (rt_interrupt_nest == 0) && (rt_critical_level() == 0))
    {
        rt_mutex_release(&mutex_spiflash);
    }
}
举报

刘军

2023-2-13 13:53:39
简称中断里面不能使用mutex,最好能应用代码中避免这种情况。
假设线程中正在操作FLASH,然后被中断,再在中断里面操作FLASH,这结果就很难预料了。
举报

刘艳

2023-2-13 13:53:45
这个BSP带有静态库,源码里看不到这几个函数的调用,应该是静态库里关联调用到的。建议原厂增加这方面的介绍。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分