精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Ulog使用硬件RTC時(shí)間戳信號(hào)量鎖死分析

冬至子 ? 來(lái)源:Code_Monkey ? 作者:Code_Monkey ? 2023-08-10 17:00 ? 次閱讀

一、現(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ì)比

1.jpg

三、臨時(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í)間的提示

1.jpg

五、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

1.jpg

當(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;
}

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • RTC
    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)注

    0

    文章

    24

    瀏覽量

    3813
  • HAL庫(kù)
    +關(guān)注

    關(guān)注

    1

    文章

    114

    瀏覽量

    6181
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FreeRTOS信號(hào)量使用教程

    信號(hào)量是操作系統(tǒng)中重要的一部分,信號(hào)量一般用來(lái)進(jìn)行資源管理和任務(wù)同步, FreeRTOS中信號(hào)量又分為二值信號(hào)量、 計(jì)數(shù)型信號(hào)量、互斥
    的頭像 發(fā)表于 12-19 09:22 ?3121次閱讀
    FreeRTOS<b class='flag-5'>信號(hào)量</b>使用教程

    Linux驅(qū)動(dòng)開(kāi)發(fā)筆記-自旋信號(hào)量

    :如果在寫(xiě)代碼時(shí),有以上的競(jìng)態(tài)發(fā)生,一定要注意進(jìn)行互斥訪問(wèn)7.解決競(jìng)態(tài)的方法:中斷屏蔽原子操作自旋信號(hào)量如何使用以上4個(gè)機(jī)制呢?1.中斷屏蔽解決哪些情況的競(jìng)態(tài):進(jìn)程和進(jìn)程的搶占中斷和進(jìn)程中斷和中斷
    發(fā)表于 08-30 18:08

    信號(hào)量、互斥、自旋

    信號(hào)量、互斥、自旋http://bbs.edu118.com/forum.php?mod=viewthread&tid=488&fromuid=231(出處: 信盈達(dá)IT技術(shù)社
    發(fā)表于 08-29 09:48

    信號(hào)量和互斥信號(hào)量的相關(guān)資料分享

    信號(hào)量簡(jiǎn)介信號(hào)量就是一個(gè)上鎖的機(jī)制,代碼必須獲得鑰匙才能執(zhí)行,一旦獲得了信號(hào)量,就相當(dāng)于該代碼具有了進(jìn)入被代碼的權(quán)限。說(shuō)白了,就和java多線程中常用的
    發(fā)表于 03-02 07:11

    Ulog使用硬件RTC時(shí)間信號(hào)量的原因及解決方案

    一、現(xiàn)象描述在使能硬件RTC,初始化階段未設(shè)置時(shí)間的情況下【測(cè)試環(huán)境為4.1.0版本Env創(chuàng)建的Keil工程】如果開(kāi)啟Ulog時(shí)間
    發(fā)表于 03-14 14:28

    ulog里現(xiàn)在默認(rèn)的時(shí)間是從哪里獲取的呢?

    我現(xiàn)在用的外部RTC,想在ulog里的時(shí)間顯示外部RTC時(shí)間,
    發(fā)表于 11-14 14:22

    ulog里用的時(shí)間是從哪里取的?

    我現(xiàn)在用的外部RTC,想在ulog里的時(shí)間顯示外部RTC時(shí)間
    發(fā)表于 05-11 09:56

    你了解Linux 各類(lèi)信號(hào)量?

    內(nèi)核信號(hào)量與用戶信號(hào)量,用戶信號(hào)量分為POXIS信號(hào)量和SYSTEMV信號(hào)量,POXIS信號(hào)量
    發(fā)表于 05-04 17:19 ?2495次閱讀
    你了解Linux 各類(lèi)<b class='flag-5'>信號(hào)量</b>?

    信號(hào)量和自旋

    自旋不應(yīng)該被持有時(shí)間過(guò)長(zhǎng)。如果需要長(zhǎng)時(shí)間鎖定的話, 最好使用信號(hào)量。自旋的基本形式如下:??? spin_lock(&mr_lock);
    發(fā)表于 04-02 14:43 ?798次閱讀

    uCOS信號(hào)量源碼的詳細(xì)資料分析

    本文檔的主要內(nèi)容詳細(xì)介紹的是uCOS信號(hào)量源碼的詳細(xì)資料分析信號(hào)量相關(guān)的函數(shù) 創(chuàng)建一個(gè)信號(hào)量,參數(shù)是信號(hào)量的初始值,創(chuàng)建成功返回值是
    發(fā)表于 06-17 17:38 ?7次下載
    uCOS<b class='flag-5'>信號(hào)量</b>源碼的詳細(xì)資料<b class='flag-5'>分析</b>

    Linux信號(hào)量(2):POSIX 信號(hào)量

    上一章,講述了 SYSTEM V 信號(hào)量,主要運(yùn)行于進(jìn)程之間,本章主要介紹 POSIX 信號(hào)量:有名信號(hào)量、無(wú)名信號(hào)量。 POSIX 信號(hào)量
    的頭像 發(fā)表于 10-29 17:34 ?691次閱讀

    開(kāi)源硬件信號(hào)量在行動(dòng)

    電子發(fā)燒友網(wǎng)站提供《開(kāi)源硬件信號(hào)量在行動(dòng).zip》資料免費(fèi)下載
    發(fā)表于 11-16 10:22 ?0次下載
    開(kāi)源<b class='flag-5'>硬件</b><b class='flag-5'>信號(hào)量</b>在行動(dòng)

    FreeRTOS的二值信號(hào)量

    FreeRTOS中的信號(hào)量是一種任務(wù)間通信的方式,信號(hào)量包括:二值信號(hào)量、互斥信號(hào)量、計(jì)數(shù)信號(hào)量,本次實(shí)驗(yàn)只使用二值
    的頭像 發(fā)表于 02-10 15:07 ?1467次閱讀

    Free RTOS的計(jì)數(shù)型信號(hào)量

    上篇講解了二值信號(hào)量,二值信號(hào)量只能判斷有無(wú),而不能確定事件發(fā)生的次數(shù),因此我們?yōu)榱舜_定事件的次數(shù)引入了計(jì)數(shù)型信號(hào)量!
    的頭像 發(fā)表于 02-10 15:29 ?1001次閱讀
    Free RTOS的計(jì)數(shù)型<b class='flag-5'>信號(hào)量</b>

    使用Linux信號(hào)量實(shí)現(xiàn)互斥點(diǎn)燈

    信號(hào)量常用于控制對(duì)共享資源的訪問(wèn),有計(jì)數(shù)型信號(hào)量和二值信號(hào)量之分。初始化時(shí)信號(hào)量值大于1的,就是計(jì)數(shù)型信號(hào)量,計(jì)數(shù)型
    的頭像 發(fā)表于 04-13 15:12 ?789次閱讀
    使用Linux<b class='flag-5'>信號(hào)量</b>實(shí)現(xiàn)互斥點(diǎn)燈