真正能用於產品的**為非阻塞**,需要做分層和隔離,為此使用了佇列結構,另外為了標誌各個狀態,使用大量的變數,這些都增加了ram儲存器的消耗,由於51的資源很有限,如何才能最大化的發揮ram空間呢?本文來**這個問題。
筆者最近設計了一款鍵盤矩陣的模組,使用51微控制器作為編碼器,檢測哪乙個按鍵被按下,是長按,還是短按,並通過串列埠輸出其鍵值,這樣在其他的複雜的工程中,只需要直接用主處理器的串列埠讀取鍵值並做相應的操作即可。這樣就避免每次都根據不同的專案在主處理器上做大量的程式改動了,更換鍵盤也不會引起很大的改動。
而主處理器只需要預留乙個串列埠即可,硬體平台變化後,不會影響io口的規劃,而如果直接使用主處理器,比如stm32,來控制鍵盤需要占用9個io引腳,在不同的專案中切換時都需要重新規劃io口。
圖1:鍵盤矩陣實物圖 [1]
**採用了非阻塞**,並做了分層和隔離,為此使用了佇列結構,另外為了標誌各個狀態,使用了大量的變數,這些都增加了ram儲存器的消耗,由於51的資源很有限,如果不做調整就會報錯:
那麼如何最大化發揮51微控制器ram的空間呢?
51提供bit定義,對於原來使用char、int的變數,如果其值只是0或者1,那麼將其改為bit型別。
//滿洲里國峰電子科技 guofengdianzi.com
//已下**基於stc89c52
#define key_not_pressed 0
//之前做好的庫函式中的變數定義
char key11_value=key_not_pressed;
//修改為bit型別
bit key11_value=key_not_pressed;
同樣的如果變數的範圍不需要那麼大,將其降級,比如從int型修改為char型。
//滿洲里國峰電子科技 guofengdianzi.com
//已下**基於stc89c52
//之前做好的庫函式中的變數定義
static
unsigned
int key11timers,key11timerl;
//"降級「變數的型別
static
unsigned
char key11timers,key11timerl;
在非阻塞**的結構中經常會用到佇列、堆疊這樣的結構,用作快取,具體表現為乙個陣列,在ram大小有限的情況下,應根據實際需要適當剪裁快取區的大小,例如本案例中,鍵盤為慢速輸入裝置,而裝置功能單一只是對按鍵鍵值傳輸,因此,可以將按鍵快取區和串列埠快取區的大小減小。
//滿洲里國峰電子科技 guofengdianzi.com
//已下**基於stc89c52
#define txbuf_size 64
//例如串列埠傳送快取
unsigned
char tx_buff[txbuf_size]
;//可考慮將txbuf_size的大小改小
//#define txbuf_size 8
然而修改了傳送快取的大小後,使用printf需要注意,例如:
//滿洲里國峰電子科技 guofengdianzi.com
//已下**基於stc89c52
#define txbuf_size 4
//例如串列埠傳送快取
unsigned
char tx_buff[txbuf_size]
;printf
("------"
):
使用串列埠助手列印:
圖2:快取不夠,列印不完整
從圖2中可以看出值只列印出了5個橫線,說明快取太小,後面幾個橫線列印不出來,這種情況在列印漢字的時候會出現亂碼,需要注意。
stc89c52提供256位元組的外部ram,可以將大型的陣列,快取區放入其中,使用xdata關鍵字,例如上面的串列埠快取區:
//滿洲里國峰電子科技 guofengdianzi.com
//已下**基於stc89c52
#define txbuf_size 64
//例如串列埠傳送快取
unsigned
char xdata tx_buff[txbuf_size]
;//可考慮將txbuf_size的大小改小
//#define txbuf_size 8
引用:
[1]:
視窗的最大化
原來的 15.13 判斷視窗的最大化 最小化狀態並進行控制 mfc中的cwnd類提供了下面兩個函式用於判斷視窗的最大化 最小化狀態,其子類繼承了這些函式 iszoomed 判斷視窗是否處於最大化狀態。isiconic 判斷視窗是否處於最小化狀態。可以使用cwnd showwindow函式設定視窗的顯...
ACM Yougth的最大化
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述yougth現在有n個物品的重量和價值分別是wi和vi,你能幫他從中選出k個物品使得單位重量的價值最大嗎?輸入有多組測試資料 每組測試資料第一行有兩個數n和k,接下來一行有n個數wi和vi。1 k n 10000 1 wi,vi ...
最大化 如何將RPA的價值最大化?
自動化技術讓企業能夠更有效的利用資源,減少由於人為失誤而造成的風險損失。隨著科技的進步,實現自動化的途徑變得更加多樣化。據forrester 自動化技術將在2019年成為引領數位化轉型的前沿技術,幫助重塑商業模式和客戶體驗。但是市面上有那麼多提供自動化技術的產品,究竟選擇哪乙個更合適?尤其是當這些技...