一、現(xiàn)象描述
在使能硬件RTC,初始化階段未設(shè)置時(shí)間的情況下【測(cè)試環(huán)境為4.1.0版本Env創(chuàng)建的Keil工程】
如果開(kāi)啟Ulog時(shí)間戳,打印日志導(dǎo)致線程鎖死
根本原因?yàn)榇蛴r(shí)間戳日志的過(guò)程中由于未設(shè)置時(shí)間,導(dǎo)致再次調(diào)用日志打印,在以下函數(shù)中掛起線程
/* drv_rtc.c 文件 /
if (HAL_RTCEx_BKUPRead(&RTC_Handler, RTC_BKP_DR1) != BKUP_REG_DATA)
{
LOG_I("RTC hasn't been configured, please use command to config.");
/ 其他代碼省略 */
}
在LOG_I()中再次運(yùn)行LOG_I()導(dǎo)致output_lock上鎖兩次
output_lock上鎖本質(zhì)為接收信號(hào)量ulog.output_locker
ulog初始化的信號(hào)量為1
第一次上鎖信號(hào)量減一
再次調(diào)用LOG_I導(dǎo)致第二次上鎖
第一次的鎖還沒(méi)有解開(kāi)
第二次上鎖導(dǎo)致鎖死現(xiàn)象,直接掛起線程
Ulog無(wú)法輸出任何信息
二、對(duì)比分析
由于之前使用RT-Studio的4.0.3版本可以正常輸出提示
所以將4.1.0與4.0.3對(duì)比分析并排查問(wèn)題
硬件平臺(tái):STM32F407 正點(diǎn)原子探索者開(kāi)發(fā)板
以下表格是在進(jìn)入主線程之前為未設(shè)置時(shí)間的RTC初始化流程對(duì)比
三、臨時(shí)解決方案
方案一:避開(kāi)初始化未設(shè)置時(shí)間的提示,增加RTC初始化函數(shù),在進(jìn)入主線程之前設(shè)置時(shí)間
缺點(diǎn):如果真的忘記設(shè)置時(shí)間,導(dǎo)致死鎖又要踩坑,花時(shí)間排查原因,影響開(kāi)發(fā)進(jìn)度
方案二:保留始化未設(shè)置時(shí)間的提示,避開(kāi)第二次上鎖,將 LOG_I 修改為 rt_kprintf
缺點(diǎn):無(wú)論是否開(kāi)啟Ulog,依舊會(huì)有提示,其實(shí)影響不是很大,甚至在未開(kāi)啟Ulog也會(huì)有提示
? 【前提條件是開(kāi)啟了串口或者其他控制臺(tái)輸出,如果沒(méi)開(kāi)啟控制臺(tái)輸出不知道會(huì)發(fā)生什么】
方案三:直接將未設(shè)置時(shí)間的提示注釋掉,由于不會(huì)第二次上鎖,所以日志打印正常
缺點(diǎn):未設(shè)置時(shí)間不會(huì)提示
方案四:使用4.0.3版本
方案五:Ulog不使用時(shí)間戳格式
四、場(chǎng)景復(fù)現(xiàn)
理論上只要是STM32的單片機(jī)都會(huì)有這個(gè)問(wèn)題,其他廠家的未測(cè)試過(guò)
以下測(cè)試平臺(tái)以正點(diǎn)原子的探索者開(kāi)發(fā)板為參考,場(chǎng)景復(fù)現(xiàn)大同小異
據(jù)說(shuō)該開(kāi)發(fā)板的啟動(dòng)電路的串口設(shè)置為控制臺(tái)打印會(huì)有一些沖突
如果發(fā)現(xiàn)不能正常打印最好換一個(gè)串口或者使用RTT作為控制臺(tái)輸出
(1)鎖死環(huán)境復(fù)現(xiàn)
打開(kāi) ···rt-threadbspstm32stm32f407-atk-explorer
右鍵打開(kāi)Env 輸入scons —dist
打開(kāi)dist文件夾中新生成的bsp工程
右鍵打開(kāi)Env 輸入menuconfig
進(jìn)入 RT-Thread Kernel -> Kernel Device Object 修改可以使用的控制臺(tái)設(shè)備【如:uart1,jlinkRtt】
RT-Thread Comonents -> Device Drivers Using RTC device drivers
RT-Thread Comonents -> Utilities Enable ulog
log format -> Enbale timestamp format for time
Hardware Drivers Config -> On-chip Peripheral Drivers EnableRTC RTC_USING_LSE
Esc 然后選擇Yes保存配置
打開(kāi) ···boardCubeMX_Config文件夾,配置CubeMX
打開(kāi)Keil,復(fù)制生成的時(shí)鐘配置,注釋掉msp文件的Error_Handler()已防止后續(xù)編譯錯(cuò)誤
復(fù)制一下內(nèi)容到 main.c 僅供參考
#include
#include
#include
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include
/* defined the LED0 pin: PF9 /
#define LED0_PIN GET_PIN(F, 9)
int main(void)
{
/ set LED0 pin mode to output */
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
while (1)
{
rt_pin_write(LED0_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED0_PIN, PIN_LOW);
rt_thread_mdelay(500);
LOG_D("Hello RT-Thread!");
}
}
編譯代碼并下載到芯片,發(fā)現(xiàn)日志打印失敗,燈不閃爍,此時(shí) main線程已經(jīng)掛起
(2)對(duì)比環(huán)境復(fù)現(xiàn)
測(cè)試平臺(tái)為RT-Studio 2.2.1【其實(shí)和Studio版本關(guān)系不大】
基于芯片創(chuàng)建的RT-Thread工程
本文就不詳細(xì)說(shuō)明Studio的配置步驟了
以下圖片為Ulog配置
復(fù)制上面的main函數(shù),一切運(yùn)行正常,并有未設(shè)置時(shí)間的提示
五、Ulog及RTC其它問(wèn)題的吐槽
(1)部分設(shè)備注冊(cè)的日志信息無(wú)法打印
主要原因是初始化順序不可控,使用 INIT_BOARD_EXPORT(ulog_init);
不能保證在設(shè)備注冊(cè)之前初始化
使初始化階段部分打印之間 return
void ulog_voutput(······)
{
/* ······ /
if (!ulog.init_ok)
{
return;
}
/ ······ */
}
例如以下打印在我的測(cè)試環(huán)境下就是直接 return
LOG_I("I2C bus [%s] registered", bus_name);
(2)STM32的LSE和LSI不能同時(shí)開(kāi)啟
為什么需要同時(shí)開(kāi)啟?
因?yàn)楠?dú)立看門(mén)狗的時(shí)鐘源是LSI
當(dāng)使用LSE作為RTC的時(shí)鐘源
如果關(guān)閉LSI是否會(huì)導(dǎo)致獨(dú)立看門(mén)狗工作異常?【實(shí)際情況未測(cè)試,可能和初始化順序有關(guān)】
具體看以下代碼
/* drv_rtc.c */
static rt_err_t stm32_rtc_init(void)
{
__HAL_RCC_PWR_CLK_ENABLE();
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
#ifdef BSP_RTC_USING_LSI
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.LSEState = RCC_LSE_OFF;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
#else
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
#endif
HAL_RCC_OscConfig(&RCC_OscInitStruct);
if (rt_rtc_config() != RT_EOK)
{
LOG_E("rtc init failed.");
return -RT_ERROR;
}
return RT_EOK;
}
-
RTC
+關(guān)注
關(guān)注
2文章
530瀏覽量
66332 -
STM32單片機(jī)
+關(guān)注
關(guān)注
59文章
549瀏覽量
58650 -
STM32F407
+關(guān)注
關(guān)注
15文章
187瀏覽量
29381 -
獨(dú)立看門(mén)狗
+關(guān)注
關(guān)注
0文章
24瀏覽量
3813 -
HAL庫(kù)
+關(guān)注
關(guān)注
1文章
114瀏覽量
6181
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論