ไอ้ 3 อันนี้ ผมเข้าใจถูกเปล่าอ่ะ..??

Started by TaoTao, October 16, 2017, 05:22:24 PM

Previous topic - Next topic

TaoTao

เป็นไฟล์ Project.map ครับ
บทสรุป 3 บรรทัดนี้..

//-------------------------------------------
  4 506 bytes of readonly  code memory
    681 bytes of readonly  data memory
    311 bytes of readwrite data memory
//-------------------------------------------

คือ เข้าใจว่า
มันจะมี ส่วนของ โค้ด กับ ตัวแปร

4506 คือ ส่วนโค้ด
311 read-write น่าจะเป็นส่วน ตัวแปร ไว้ที่ Ram หรือเปล่าหว่า.. ??
แล้ว 681 คืออะไรครับ..??

อย่างสมมติ Ram 1kByte
จะเหลือเท่าไหร่ สำหรับกรณีนี้ครับ

ใครเข้าใจส่วนนี้ ให้ความกระจ่างที
นานๆ จะกลับมาจับ  @_@!
ขอบคุณล่วงหน้าครับ

dec

681 bytes of readonly  data memory

คือค่าคงที่ครับ (section .rodata) ข้อมูลค่าคงที่เหล่านี้อยู่ใน Flash ดังนั้นจึงเปลี่ยนแปลงค่าไม่ได้

ที่ใช้กันบ่อย ๆ ก็มี 2 ประเภท คือตัวแปรค่าคงที่ (มี const นำหน้า) เช่น

const int x = 10;

แล้วก็พวก string ที่เรานิยามในโปรแกรมเช่น

printf("Hello");

หรือ

char *str = "Hello"

ตัว string "Hello" นี้จะถูกจัดเป็นค่าคงที่

ส่วนข้อมูล ram เหลือเท่าไหร่ ก็เอา ram ทั้งหมด ลบขนาดข้อมูล readwrite ได้เลยครับ

.
.
.

เสริมอีกนิด
ข้อมูล readwrite อยู่ในแรมก็จริง แต่ถ้าเป็นตัวแปรที่กำหนดค่าเริ่มต้น เช่น

int x = 5;

ค่า 5 จะถูกเก็บอยู่ใน Flash ครับ แล้วตอนที่ Boot ระบบถึงจะมีการ copy ค่า 5
มาป้อนให้ตัวแปร x ก่อนที่จะวิ่งเข้า main

wlasoi

ส่วนมากจะแนวนั้นแหละ ครับ แต่ก็ขึ้นกับ Compiler แต่ล่ะตัวด้วย  .rodata ของ Compiler บางตัวสามารถ Optimize
ย้ายลงไว้ที่ Flash อย่างเดียวได้ (gcc ทำได้) ส่วนมากถ้าไม่ทำอะไรจะ default จะเก็บไว้ทั้ง Flash และ RAM เวลา printf("text");
นี่แหละตัวดี เปลืองหน่วยความจำมาก

https://www.ele.uva.es/~jesus/hardware_empotrado/Compiler.pdf


dec

.rodata ถ้า Default จะอยู่ใน Flash อย่างเดียวครับ

ต้องเป็น .data ครับ ถึงจะอยู่ใน Ram และ Flash (ส่วนที่อยู่ใน Flash คือค่าเริ่มต้น)

ส่วน .bss คือตัวแปรที่ไม่มีค่าเริ่มต้นจะกินพื้นที่ Ram อย่างเดียว

แต่สามารถเอา .rodata ไปไว้ใน Ram ได้โดยการแก้ Linker Script แล้วมันจะกินพื้นที่ Ram และ Flash
เหมือนกับ .data เลย แล้ว Compiler ก็จะไม่อนุญาติให้เราเปลี่ยนค่ามันด้วยครับ

TaoTao

คือ ทุกวันนี้ ผมจะ initial ทุกตัวแปรไว้เสมอ
แม้กระทั่ง Global Variable แม้ว่า เป็น ศูนย์
เช่น page = 0;
แสดงว่า ค่า ศูนย์ ถูกบันทึกไว้ที่ FLASH MEM
แต่ หากไม่กำหนด ค่าเริ่มต้น ก็ยังคงเป็น ศูนย์
แต่ ไม่เปลือง พท. FLASH ใช่หรือเปล่าครับ..??

ถ้าเป็น Array ยาวๆ initial ทีนึง คงเปลืองมโหฬาร  :o

dec

กำหนดเป็น 0 ได้ครับ

ตัวแปร global ที่ไม่ได้กำหนดค่า กับ กำหนดค่าเป็น 0 จะถูกจัดอยู่ section .bss เหมือนกัน จะไม่กินพื้นที่ flash ครับ

(section .bss คือ ส่วนที่โปรแกรมจะทำการ zero fill ทั้ง section ก่อนที่จะเริ่มเข้า main ครับ)

ถ้ากำหนดเป็นค่าอื่นที่ไม่ใช่ 0 จะถูกจัดอยู่ section .data ทันที