recovery 公升級介面頂部花屏問題分析

2022-08-22 13:30:14 字數 1749 閱讀 9975

說明:

實際解決問題的過程有點曲折,後面找到原因,分析清楚問題後,總結下正確的分析方法,大致分析流程如下。

問題描述:

在進入recovery的時候,第一次上電進入recovery時,頂部會有一長條花屏,如下圖所示。

問題分析:

通過出現花屏的時間點,我們判斷,出現花屏的時候,已經進入了recovery系統,那麼出現花屏的分析點,定位在recovery中。

通過在recovery中定位,我們發現是,在gr_init初始化的過程出現的花屏,具體是函式get_framebuffer這個函式,通過一步步的跟蹤,發現如下規律:

在ioctl(fd, fbioput_vscreeninfo, &vi)呼叫之後,整個螢幕花了,在第一次memset(fb->data, 0, vi.yres * fi.line_length);呼叫之後,螢幕又全部黑了。

我們大致可以猜測,在啟動過程中,螢幕開始是黑屏的,中間花屏了一次,後來又黑屏,在花屏 -> 黑屏的過程,時間太長了,那麼我們就看到了頂部的一長條的花屏現象,為了驗證這個問題,我們在memset(fb->data, 0, vi.yres * fi.line_length);之前,嘗試增加延時時間,看能不能看到跟明顯的花屏現象。在我們嘗試增加不同的延時時間,當延時usleep(5*1000)時,我們看到了如下現象:

這跟我們的預期一樣,就是在初始化的過程,中間有一次花屏,然後清除螢幕(memset),在這個花屏到黑屏的過程,時間差很短暫,這樣我們就看到了頂部的一長條花屏現象。

讓我們疑惑的是,ioctl(fd, fbioput_vscreeninfo, &vi)這個過程,怎麼會花屏,這個是設定螢幕可變引數的ioctl,可能是由於我們修改了螢幕的可變引數,使得螢幕重新整理了下,把framebuffer緩衝區的資料顯示在了螢幕上面,這樣導致了花屏,那麼就是framebuffer緩衝區的資料沒有清空,帶著這個疑惑,我們在啟動過程,檢視下對應記憶體位址的資料。

我們從dts中,檢視到framebuffer的記憶體位址是0x3c000000,

fb_reserved:linux,meson-fb ;
在uboot下面md

我們對比下,正常不花屏的時候的記憶體資料:

顯然問題明白了,framebuffer中的資料沒有被清除,這樣起來進入recovery初始化的時候,ioctl(fd, fbioput_vscreeninfo, &vi)設定可變引數的時候,把緩衝區的資料顯示到螢幕上面,這樣導致了花屏的產生。

問題總結:

主要的花屏原因,是因為framebuffer對於的記憶體中的資料未被清空,導致的ioctl跟memset過程時間差,導致了花屏現象,在這之前,清除framebuffer緩衝區的資料即可。

react介面跳轉,滾動到頂部

在使用react router dom時,我們經常會遇到路由切換時滾動到瀏覽器頂部的問題。很多時候我們需要的是滾動到頂部 scroll to top 因為發現好像所有的單頁面都有乙個通病,就是頁面進行跳轉時,當前所在的位置和你上個介面所在的位置一樣,顯然這樣對於使用者來說體驗不是很好。我們可以使用使...

HTTP介面架構公升級

後來我們放棄了使用靜態檔案的方式,使用redis來儲存詳情頁資料 通過指令碼定時寫入或者是發布內容的時候觸發寫入 並使用redis自帶的主從同步機制,將資料同步到前端各台伺服器。這樣做的好處是 不僅不用管內容的同步了,把所有同步問題都甩給redis本身,而且從redis裡面取出資料時,可以根據來自客...

介面公升級版

介面公升級版 假設乙個介面由2w個子類實現它 假如在介面內加乙個方法 那麼按照定義就要在這所有的子類裡面都實現 所以我們引入新概念 介面裡可以定義普通方法 即這個普通方法可以不被實現 普通方法就要用default實現 介面還可以實現static方法 呼叫是直接由介面.方法名呼叫 inte ce im...