在嵌入式培訓班C語言實訓過程中,我發現,講數組學生們很容易理解,但是一旦涉及到指針,學生們開始懵了。對於他們來說,指針很難,這是因爲很多學生沒有系統的學習過C語言,或者說他們上C語言的時候沒有很好的學習。
反而嵌入式培訓班C語言到了講數組,學生們卻運用的很溜,針對於這種情況,我改變了我實訓的方式,凡是涉及到指針方面的問題,儘量用數組的寫法表達出來,同時也給學生們分析一下指針與數組的聯繫和區別。其中重點表示在開發板的LCD屏幕上顯示圖片這一塊。
對於數組來說,數組名是數組首元素的地址,也就是說數組名存儲的是數組的首元素地址,那麼在C語言裏面什麼類型的變量是用來保存地址的呢?答案是指針。既然如此,那麼使用一個類型對應的指針變量來保存數組的首元素地址,是不是這個指針變量也可以使用數組表示數組元素的寫法來描述數組的元素?經過測試,確實是可以的,而且指針更加靈活,因爲數組名雖然存儲的是數組首元素的地址,但是它不能被重新賦值,這是因爲數組一旦確定大小,在內存中申請到空間後是固定的,但是指針變量沒有這種限制。所以,但使用mmap函數對屏幕進行映射的時候,通常是先給學生講解二維數組的概念,如何使用二維數組和write函數對LCD屏幕進行操作,以及指針與數組寫法的聯繫,然後將mmap函數映射出來的地址保存到一個數組指針裏面去,就可以在顯示的時候使用二維數組的寫法來實現。
以下是代碼示例:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
int lcd_fd;
int (*fbp)[800];
int show_bmp(char * bmp_pathname)
{
int bmp_fd;
char bmp_buf[800*480*3] = {0};
int tmp_buf[800*480] = {0};
int i,j,x,y;
//打開圖片
bmp_fd = open(bmp_pathname,O_RDWR);
if(bmp_fd == -1)
{
perror("open bmp ");
return -1;
}
//跳過圖片54個字節的頭信息
lseek(bmp_fd,54,SEEK_SET);
//讀取像素數據
read(bmp_fd,bmp_buf,800*480*3);
//調整像素數據
for(i=0;i<800*480;i++)
{
tmp_buf[i] = bmp_buf[0+i*3] | bmp_buf[1+i*3]<<8 | bmp_buf[2+i*3]<<16 | 0x00<<24;
}
//像素位置調整並顯示到屏幕上面去
for(y=0;y<480;y++)
{
for(x=0;x<800;x++)
{
fbp[y][x] = tmp_buf[(479-y)*800+x];
}
}
close(bmp_fd);
return 0;
}
int main()
{
//打開LCD
lcd_fd = open("/dev/fb0",O_RDWR);
if(lcd_fd == -1)
{
perror("open lcd");
return -1;
}
//映射屏幕
fbp = (int (*)[800])mmap(0,800*480*4,PROT_READ | PROT_WRITE,MAP_SHARED,lcd_fd,0);
if(fbp == MAP_FAILED)
{
perror("mmap fail");
return -1;
}
show_bmp("0.bmp");
close(lcd_fd);
return 0;
}