linux framebuffer的框架非常簡單, 對於應用程式就是操作一塊記憶體(俗稱幀快取), 當然也有可能是雙快取, 一般用於高幀率場景, 一塊幀在填充資料時, 另一塊在顯示, 接著對調過來,
那通過設定**告知驅動層讀取哪塊幀資料呢? 答案是用vinfo.xoffset, vinfo.yoffset
需要注意的是, 無論用write()、還是mmap()後直接操作記憶體都只是填充記憶體而已, 並不代表能夠立馬顯示, 這得看驅動, 如果驅動實現了自重新整理(不斷從幀快取拿資料刷到lcd上), 那填充資料到幀快取就會立馬顯示出來,
如果驅動沒有實現,那應用程式需要主動的呼叫 ioctl(fp, fbiopan_display, &vinfo);, 告知驅動可以刷資料了, 如果這都沒顯示出來, 估計驅動沒實現fbiopan_display功能。
示例**:(驅動實現自重新整理, 應用依次顯示黃、藍、紅,最後畫線)
#include #include#include
#include
#include
#include
#include
#define red 0xf800
#define yellow 0xffe0
#define blue 0x001f
#define white 0xffff
#define black 0x0000
void fill_color16(short *fb_addr, short bit_map, int
psize)
}int
main ()
if(ioctl(fp, fbioget_fscreeninfo, &finfo))
if(ioctl(fp, fbioget_vscreeninfo, &vinfo))
screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8
; printf(
"the phy mem = 0x%x, total size = %d(byte)\n
", finfo.smem_start, finfo.smem_len);
printf(
"xres = %d, yres = %d, bits_per_pixel = %d\n
", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);
printf(
"so the screensize = %d(byte), using %d frame\n
", screensize, finfo.smem_len/screensize);
printf(
"vinfo.xoffset = %d, vinfo.yoffset = %d\n
", vinfo.xoffset, vinfo.yoffset);
printf(
"vinfo.vmode is :%d\n
", vinfo.vmode);
printf(
"finfo.ypanstep is :%d\n
", finfo.ypanstep);
printf(
"vinfo.red.offset=0x%x\n
", vinfo.red.offset);
printf(
"vinfo.red.length=0x%x\n
", vinfo.red.length);
printf(
"vinfo.green.offset=0x%x\n
", vinfo.green.offset);
printf(
"vinfo.green.length=0x%x\n
", vinfo.green.length);
printf(
"vinfo.blue.offset=0x%x\n
", vinfo.blue.offset);
printf(
"vinfo.blue.length=0x%x\n
", vinfo.blue.length);
printf(
"vinfo.transp.offset=0x%x\n
", vinfo.transp.offset);
printf(
"vinfo.transp.length=0x%x\n
", vinfo.transp.length);
fbp =(char *)mmap(0, screensize, prot_read | prot_write, map_shared, fp,0
);
if ((int)fbp == -1
)
printf(
"get virt mem = %p\n
", fbp);
pix_size = vinfo.xres *vinfo.yres;
/*using first frame, for fbiopan_display
* 當重新整理需要呼叫fbiopan_display, 要告知驅動刷哪塊幀, 用到下面兩個引數
* 如果使用第二幀buffer -> vinfo.xoffset = 0; vinfo.yoffset = vinfo.yres;
*/vinfo.xoffset = 0
; vinfo.yoffset = 0
;
/*show color loop
*/while(num--)
#if 1
/*這是你想畫的點的位置座標,(0,0)點在螢幕左上角
*/x = 10
; y = 10
; location = x * (vinfo.bits_per_pixel / 8) + y *finfo.line_length;
test_fbp = fbp +location;
printf(
"draw line.......\n");
for(i = 0; i < (vinfo.xres - x); i++)
*test_fbp++ = i+30
;
//ioctl(fp, fbiopan_display, &vinfo);
#endif
munmap(fbp, screensize);
/*解除對映
*/close (fp);
return0;
}
#include #include#include
#include
#include
#include
#include
#define red 0xf800
#define yellow 0xffe0
#define blue 0x001f
#define white 0xffff
#define black 0x0000
intmain ()
if(ioctl(fp, fbioget_vscreeninfo, &vinfo))
pix_size = vinfo.xres *vinfo.yres;
color1 = 0
; color2 = 0xf8
;
for(i=0; i)
close (fp);
return0;
}
C 實現的Miller Rabin素性測試程式
miller rabin素性測試演算法是概率演算法,不是確定演算法。然而測試的計算速度快,比較有效,被廣泛使用。另外乙個值得介紹的演算法是aks演算法,是三位印度人發明的,aks是他們的姓氏首字母。ask演算法是確定演算法,其時間複雜度相當於多項式的,屬於可計算的演算法。來自sanfoundry的c...
Spring Junit4 測試Web應用程式
1 環境搭建很簡單,只需要將這這兩個jar包 org.springframework.test 3.0.3.release.jar和junit 4.8.1.jar 和spring的公用包以及其它的jar包一起加入到專案中即可。2 使用時,編寫的測試類,需要繼承類abstractjunit4sprin...
python 多執行緒和協程速率測試對比
多執行緒和協程都屬於io密集型,我通過以下用例測試多執行緒和協程的實際速率對比。例項 通過socket客戶端以多執行緒併發模式請求不同伺服器端 這裡伺服器端分2種寫法 第一種伺服器通過協程實現,第二種伺服器通過多執行緒實現 的訪問速率 第一種伺服器端寫法 通過gevent實現 第二種伺服器端寫法 通...