我有一個疑問,在所有的微控制器閃存更多的內存(例如:atmega16它是16k,但RAM只是1 Kb)。 。如何在更少的內存中執行大代碼?
那麼,這個代碼是如何執行的,CPU是否直接從Flash本身執行,如果是,那麼使用這個小內存給出了什麼。
我有一個疑問,在所有的微控制器閃存更多的內存(例如:atmega16它是16k,但RAM只是1 Kb)。 。如何在更少的內存中執行大代碼?
那麼,這個代碼是如何執行的,CPU是否直接從Flash本身執行,如果是,那麼使用這個小內存給出了什麼。
閃存用於存儲您要執行的程序。他們很少改變,所以閃存是適當的。
RAM是用於在程序的執行期間所需存儲器:棧(局部變量),堆(malloc的)等使用Harvard體系結構即嚴格分離程序和數據存儲器
感謝您的答案,因爲您的RAM用於堆棧和堆等(局部變量)。 想想程序裏面只有主函數和一個非常大的數組(10 kb)(因此它變成了一個局部變量,應該存儲在堆棧i,e; RAM中)。但是RAM只有1kb,那麼會發生什麼? –
@VirendraKumar:你會用完內存。 :-)但是,如果數組是固定的,[你可以使它成爲程序的一部分](http://www.nongnu.org/avr-libc/user-manual/pgmspace.html),它將在閃存記憶。 – Heinzi
你完全不能擁有10k數組,最好的情況下,你會覆蓋你的堆棧指針,程序會自己消失。編譯器會警告你你使用的RAM太多了。 1k對於Mega16類型的應用程序來說是完全足夠的。如果你真的需要更多的內存,使用類似ARM的東西。 – DiBosco
的AVR。 與PC不同的是,首先將程序從RAM中移到RAM中,代碼直接從程序存儲器執行,只有運行時數據存儲在RAM中。
請注意,將變量設置爲const不一定會創建該變量並將其放入閃存中。雖然它在閃存中可能最好也可能不是最好,但編譯器不會自動執行此操作。
例如,查看avr-gcc的以下鏈接。
我不是專家,但我認爲,一個微控制器的存儲器僅用於存儲全局,你的棧和堆的。該程序本身直接從閃存運行。沒有消息來源,所以我沒有發佈這個答案 – Kippie
不太確定,但是,1kb仍然是1.000.000位可用。你無法解析它上面的HQ圖片,也沒有真正的大操作系統。已編譯程序的字節碼有多少? – DanFromGermany
感謝您的答案,因爲您的RAM用於堆棧和堆等(局部變量)。想想只有主函數的程序和在其中聲明的非常大的數組(10 kb)(因此它變成了應該存儲在堆棧i,e; RAM中的局部變量)。但是RAM只有1kb,那麼會發生什麼? #Kippie –