知識社群登入
位置: 艾鍗學院 Blog > 專業論壇 > 討論
threads and 切換畫面有殘影
1樓
Hi,teacher

想請問一個工作上的問題~

平台是 單核心 arm9+embedded linux2.6.x
系統的產品上因功能的需求, 每項功能皆是個thread~ RFID, lcd 的screen update, KeyPad ....
有event 發生就用 FIFO queues 來以順序排程進而依序執行對應的功能及頁面.

UI的功能是用open source(SDL)這套去用它的api來顯示每個view(background,icon .....)
在切換LCD的頁面時,皆會有先前個畫面的殘影閃一下.

例如~ 按下了key 而 keyPad的thread 這時在處理這個event Queue 
此時lcd的screen update的thread,要如何才能show出頁面,快到人的眼睛無法看出殘影?

您的經驗是否有類似問題?


2樓
 
 若不考慮你的event loop, 先測試
 
 1. 單純地 update 整個frame buffer  會如何? LCD畫面會有殘影嗎 ?  觀察你update 的頻率
 2. 透過SDL API, 做1 的動作?  LCD畫面會有殘影嗎 ? 
 ----------------
  你 uddate FB 的 thead, 其thread 在執行中, 會發生context switch 嗎 ?
  event 發生時, 讓你的update FB thread ,可以完整的run完 (不被插斷)之後, 才可以換其他thread跑
 
 
 
    
3樓

Hi, teacher

應該是說切換畫面時,會有短暫斷層的畫面,不是很順。 

沒考慮event loop 的情況下

第一項,我沒試. 以前 Non OS的情況下,我是會等V_blank 才切換就不會出現了,但在linux 下 ????
主管說~不用懷疑到低階的韌體,他認為是系統的效能........ 小弟覺得不太是耶! 
 
第二項,用兩個320X240的背景圖,透過SDL API 不斷的切換,就有出現斷層。

不會,每個 thread 會睡不同的時間,會不斷的去看 對應的 Queues是否有工作? 有的話就run也會完整執行完。

我是把問題 看在 SDL 跟 LCD的 Vsync , 但不太知道有linux的平台 怎樣去處理?? 
QT及MINI GUI 因該也有類似問題,這應該是很有機會發生的問題。

Many tks!


4樓
 
1. 單純地 update 整個frame buffer  會如何? LCD畫面會有殘影嗎 ?  觀察你update 的頻率
 
       // open frame buffer device
        fb= open("/dev/fb0", O_RDWR);
        // get frame buffer memory mapping address
        fb_mem = mmap (NULL, 320*240*2,
                                PROT_READ|PROT_WRITE, MAP_SHARED, fb, 0);
        
        // clear frame buffer
        memset(fb_mem, 0, 320*240*2);
       
      for(i=0;I<10;I++) {
        // cpoy image to framebuffer
        memcpy(fb_mem,COLOR_HEX, 320*240*2);  
        delay(ms);
     }
 
 
這樣會不會有問題? 如果不會,那你就要K SDL 了
 
5樓
Hi teacher,

1. 單純地 update 整個frame buffer  會如何? LCD畫面會有殘影嗎 ?  觀察你update 的頻率

我現在用frame buffer 用sleep(1) 每隔一秒show  Red, Green, Blue 的320*240 image
就有 畫面斷層的現象.

以前 Non OS的情況下,我是會等V_blank 才切換就不會出現了..... 
在linux 觀察 update 的頻率?  要如何測??  才能對到 vsync?

tks a lot ! 

  
6樓
Hi teacher,

想了很久~

是不是要在driver動手? 在 xxxfb.c 寫 wait for VSYNC ioctl ? 
大概是用irq 針對 vsync的interrupt ?
 
7樓
 
1. 所以問題是"畫面斷層"  切換畫面不夠順. ?
  
幾個方向:
 
--> 系統上確定沒有很多AP程式在吃你系統資源,如cpu usage在你還沒跑測試程式之前是低的
--> 若仍只是簡單每秒uddate "局部的" framebuffer , 還是有同樣的問題碼?
 
  我認為Vsync, Hsync 都不會有問題,若有問題, 你的畫面一開始就偏移了,
   若是Driver 的問題, 會出現Drvier軟體的設計上. 我們給的SDK裡的code ,
   不會有你說的狀況, 以前用2410也不會. 所以要不要看一下你那邊的Driver 的寫法和我們的有何不一樣?
    
 
2. LCD 應該沒有VBLANK 信號
8樓
"畫面斷層,切換畫面不夠順" 是目前遇到的問題.
我用linux framebuffer 單純去連續更新畫面測試, 就是會切換畫面不夠順.

" Vsync, Hsync 都不會有問題" 我也認同, 因為靜態的畫面是沒問題的.
以前我也處理過類似的問題, 主要是在 畫面的記憶體source buffer 更新與lcd frame(vsync)的更新要能配合,

我查了一下s3c 的lcd driver 有做了一個 Add wait for VSYNC ioctl, 在static irqreturn_t s3c_fb_irq(int irq, void *dev_id)
有做s3c_fb_wait_for_vsync的處理.

   




9樓
老師, 我應該不能用mcu的角度去看這問題, 加上os 還真的問題難解.


10樓
Hi, teacher

主管說不需要想到要去改driver去等vsync, 那是MCU Non-OS的做法...
所以, 我再想想看吧!

我下 ps 也沒有看到很多AP 在跑, 
cpu usage在你還沒跑測試程式之前是低的 => 可下指令看嗎?

謝謝了
 


11樓
這是測試程式, 就上傳一下,可供教學用.

謝謝
附件
1. lcd_test.c (9 KB)
12樓
 
1.  使用 top指令 (busybox) 查看cpu usage
 
2. 
    AP <--------> Linux Driver  <-------> HAL code  <-----> H/W
          |<----------------------Kernel ------------------>|
 
 AP是很單純的填資料
        gettimeofday (&startTime, NULL);
        memcpy (fb, testImage, fbSize);
        gettimeofday (&endTime, NULL);
 
    如果連這樣,都是"鈍鈍" 地填滿一個畫面, 那就是
    其他的問題. 如果HAL code  <-----> H/W 是已經驗證OK的
    那你要想....為什麼包了linux driver上去, 會出現這樣的問題...
    先思考
 
3. 你看到只有現象. 你應該還要蒐集現象發生的可能,  接著去驗證你的猜測,
 
  過程當中,你將得到知識並累積經驗.