ระบบที่ฝังตัวได้มักต้องการการจัดการข้อมูลภายใน โดยไม่ต้องมีเครื่องแม่ข่ายฐานข้อมูลเต็มรูปแบบ การเติมข้อมูลในฐานข้อมูลแบบเบา ๆ ใน C ให้ควบคุมหน่วยความจํา, ประสิทธิภาพ และการจัดเก็บ บทความนี้ ดําเนินผ่านการออกแบบและตัวจัดการของเครื่องคอมพิวเตอร์แบบพื้นฐานที่ฝังตัวอยู่ครอบคลุมโครงสร้างข้อมูล, การดําเนินการของ CRUD, index, และความพยายามสําหรับสภาพแวดล้อมที่ประมวลผลทรัพยากร

ข้อกําหนดการจัดเก็บฐานข้อมูลแบบฝังตัว

กลไกฐานข้อมูลที่ฝังอยู่จะต้องดําเนินการภายในข้อจํากัดที่จํากัดคือ RAM, แฟลช และความเร็วในการประมวลผล ความต้องการโดยทั่วไปนั้นรวมถึงพฤติกรรมการบังคับการทํางาน, ร่องรอยรหัสที่น้อยที่สุด, และไม่มีการขึ้นต่อกันภายในเครื่อง เครื่องยนต์นี้ควรจะสนับสนุนการทํางานพื้นฐาน: แทรก, รับข้อมูล, อัปเดต, ลบทิ้ง, และการค้นหา ฐานข้อมูลต่าง ๆ ที่ฝังอยู่ในฐานข้อมูลจํานวนมากยังจําเป็นต้องอยู่รอดจากการสูญเสียพลังงาน และเก็บข้อมูลบนหน่วยความจําที่ไม่จํากัด เช่น EPPL, PERI แฟลช หรือการ์ด

การเลือกโครงสร้างข้อมูลที่ถูกต้อง เป็นการตัดสินใจออกแบบครั้งแรก อาร์เรย์เป็นการตัดสินใจที่เรียบง่ายแต่มีข้อจํากัดโดยขนาดคงที่ รายการที่เชื่อมโยงช่วยให้การเติบโตของข้อมูลได้ แต่เพิ่มค่านําไฟฟ้าได้ เพื่อเพิ่มประสิทธิภาพ การใช้ลูกผสมที่สมดุลนั้นจะใช้สระว่ายน้ําขนาดใหญ่ที่มีรายการฟรีสามารถทํางานได้ดี [FLT: 0] หลักการออกแบบของ[FLT: 1] ให้ความคมชัดขึ้น สําหรับเครื่องยนต์ที่ใช้งานได้ง่ายขึ้น

ออกแบบเลเยอร์ของแผ่นบันทึก

ชั้นจัดเก็บจัดการวิธีบันทึกที่วางอยู่ในหน่วยความจําหรือบนดิสก์ รูปแบบทั่วไปคือ การปฏิบัติต่อแต่ละแผ่นเป็นโครงสร้างที่คงที่ เพื่อลดรูปตัวชี้และอนุญาตให้ทําดัชนีโดยตรง บันทึกตัวแปรความซับซ้อนและต้องการตัวจัดการหน่วยความจํา

แผ่นเสียงแบบตรงตัว กับสระบันทึกเสียง

กําหนดจํานวนสูงสุดของแผ่น (เช่น [FT: 0] และปรับลําดับสีให้คงที่ โดยจะเป็นบิตแมพหรือรายการฟรีที่ใช้ในช่องรายการ เมื่อแผ่นลบแผ่นแล้ว การใช้วิธีการนี้จะไม่เป็นการลดระยะการวางแนวการจัดวางแบบไม่ตายตัว และรับประกันเวลาการวางตําแหน่ง O( 1)

#define MAX_RECORDS 256
typedef struct {
 int id;
 char name[32];
 float value;
 int active; // 1 if slot in use
} Record;

Record pool[MAX_RECORDS];

สําหรับที่เก็บอย่างสม่ําเสมอ สระว่ายน้ําสามารถสํารองได้โดยไฟล์หรือเขตของแฟลช เมื่อเริ่มใช้งานเครื่องยนต์อ่านสระว่ายน้ําจากหน่วยความจําที่ไม่ใช่ความจําแบบไม่จํากัดไปยัง RAM และบนการปิด (หรือช่วงเวลา) มันเขียนกลับ

ความถูกต้องของข้อมูลตรวจสอบ

เพิ่มสนาม checksum เรียบง่าย ในแต่ละแผ่น เพื่อตรวจสอบการทุจริต [FLT: 0] CRC-32 เป็นตัวเลือกที่ดีสําหรับระบบฝังตัว, สมดุลความซับซ้อนกับความแข็งแกร่งของการตรวจสอบความผิดพลาด

การเพิ่มประสิทธิภาพของปฏิบัติการ CRUD ขั้นพื้นฐาน

การ ทํา การ สํารวจ มัก จะ เป็น การ ตรวจ สอบ ด้วย ขวด หนัง ดัง นั้น การ ค้น หา แบบ เชิงเส้น ที่ ไม่ มี ความ คิด เห็น จึง เป็น ที่ ยอม รับ ได้ เฉพาะ แต่ ข้อมูล เล็ก ๆ (มี บันทึก เพียง ไม่ กี่ ร้อย แผ่น).

แทรกตัวจัดการสถานะอิสระ

รักษารายการสถานะการเข้าใช้ฟรีไว้ เมื่อใส่ค่าเพิ่ม ให้ผุดดัชนีจากรายการฟรี, กรอกข้อมูล แล้วทําการทําเครื่องหมายว่ารายการเสรีนั้น สามารถเป็นกองที่เรียบง่ายได้ โดยใช้ลําดับของจํานวนเต็ม

int free_list[MAX_RECORDS];
int free_count = MAX_RECORDS;
for (int i = 0; i < MAX_RECORDS; i++) free_list[i] = i;

int db_insert(int id, const char* name, float value) {
 if (free_count == 0) return -1; // no space
 int idx = free_list[--free_count];
 pool[idx].id = id;
 strncpy(pool[idx].name, name, sizeof(pool[idx].name)-1);
 pool[idx].value = value;
 pool[idx].active = 1;
 return idx;
}

ค้นหาและอัปเดต

โปรแกรมค้นหาบนสระธรรมดา โดยตรวจสอบเฉพาะบันทึกการทํางานเท่านั้น เพื่อค้นหาข้อมูลล่าสุด, หาบันทึก, แก้ไขช่องข้อมูล และเลือกตรวจสอบรายการใหม่ถ้าแผ่นเสียงถูกลบแล้ว

int db_find_by_id(int id) {
 for (int i = 0; i < MAX_RECORDS; i++) {
 if (pool[i].active && pool[i].id == id) return i;
 }
 return -1;
}

void db_update(int idx, float new_value) {
 if (idx >= 0 && idx < MAX_RECORDS && pool[idx].active)
 pool[idx].value = new_value;
}

แนวทางเพิ่มเติม: การทําดัชนีและการต่อเนื่อง

เมื่อจํานวนของบันทึกเพิ่มขึ้น การค้นหาแบบเชิงเส้นจะมีราคาสูง เพิ่มดัชนีที่เรียบง่าย -- เช่น ลําดับของตัวชี้ของคีย์ หรือตัวชี้ค้นหาแบบไบนารี -- การแก้ไขค่าเวลา การแก้ไขค่าระบบ การเรียงลําดับแบบคงที่จะเพียงพอหากแทรกเข้าไปอย่างยาวนาน

เรียงลําดับดัชนีด้วยการค้นหาแบบไบนารี

เก็บรายการอัลบั้มที่เรียงตามแบบขนานไว้ โดยใช้กุญแจการค้นหา (เช่น หมายเลข) เมื่อใส่แผ่นบันทึกใหม่ ให้ใส่ดัชนีเข้าไปในอาร์เรย์ของอัลบั้มเรียงโดยใช้การแทรกไบนารี จากนั้นการค้นหาจะกลายเป็น O( logn) สืบค้นโดยใช้เลขฐานสอง Delection ต้องการการเปลี่ยนรูปแบบดัชนี แต่ต้องเพิ่มฐานข้อมูลขนาดเล็กที่อนุญาต

การจัดเก็บข้อมูลต่อเนื่องโดยใช้แฟ้ม I/O

บนระบบควบคุมไมโคร (FLT: 5) / [FLT: 6] ใช้รูปแบบแฟ้มง่าย: เขียนส่วนหัว (เลขภาพ, อัลบั้ม, เลขลําดับ) ตามด้วยลําดับที่ฝังอยู่ สําหรับการชนกัน, ปูมบันทึกแบบย่อ (WAL) สามารถช่วยเหลือเครื่องยนต์แบบพื้นฐาน (FLT: 5) ได้ในหน้าหนึ่ง (FLT: 0) ใช้รูปแบบแฟ้มแบบง่าย: เขียนเลขธรรมดา (อัลบั้ม) ใช้รูปแบบย่อย (ระบบย่อย: ระบบย่อย: ระบบย่อย: ระบบย่อย: ระบบย่อย: ระบบย่อย: ระบบย่อย: ระบบย่อย: ระบบ ไฟล์ (FTLT) ไฟล์) ไฟล์แบบฝังตัวแบบฝังตัวแบบ ): ระบบแบบ luffic (FTL (FTL) เป็นแฟ้มแบบฝังตัว) ไฟล์แบบ ขนาดใหญ่ (FTLEF). ไฟล์แบบ ไฟล์แบบ ขนาดใหญ่ (F) เป็นแฟ้มแบบย่อ) ขนาดใหญ่ (แบบย่อ) ขนาดใหญ่

void db_save(const char* filename) {
 FILE* fp = fopen(filename, "wb");
 if (!fp) return;
 fwrite(pool, sizeof(pool), 1, fp);
 fclose(fp);
}

void db_load(const char* filename) {
 FILE* fp = fopen(filename, "rb");
 if (!fp) return;
 fread(pool, sizeof(pool), 1, fp);
 fclose(fp);
 // Rebuild free-list from pool
 free_count = 0;
 for (int i = 0; i < MAX_RECORDS; i++) {
 if (!pool[i].active) free_list[free_count++] = i;
 }
}

กรมฝึกและทําการค้าขาย

เครื่องยนต์ฐานข้อมูลที่ฝังแนบมาด้วย ต้องเผชิญกับการค้าขายที่ต่อเนื่อง ระหว่างคุณสมบัติและการใช้ทรัพยากร การเลือกคุณสมบัติที่จะรวมเข้ากับความสามารถนั้น ๆ นั้น ขึ้นอยู่กับโปรแกรม:

  • [FLT: 0]. acid true - โดยทั่วไปก็ไม่จําเป็น อะตอมแบบง่ายเขียนเพียงพอสําหรับข้อมูลเซ็นเซอร์ส่วนใหญ่
  • [FLT: 0]. การเพิ่ม – เพิ่มค่าใช้จ่ายการแทรก แต่ความเร็วการอ่าน สําหรับการเขียนโหลดงานข้ามดัชนี
  • [FLT: 0] คอนคอร์เรซีย – ระบบส่วนใหญ่ที่ฝังแน่นคือ วิ่งเป็นแถว เกลียว เลเวอร์เรเรจถ้าใช้ RTOS
  • [FLT: 0]. ใช้ ค่าคงที่สําหรับบัฟเฟอร์ ขนาด
  • [FLT: 0] สูญเสีย Power - สําหรับแฟลชสปอร์สที่เก็บ หลีกการเขียนน้อยบ่อย การปรับปรุงบุฟเฟ่ต์ และใช้สองชุด

ตัวอย่าง: ฐานข้อมูลตัวติดตามอุณหภูมิ

ลองพิจารณาเซ็นเซอร์อุณหภูมิ ไอโอที ที่บันทึกทุกนาที และเก็บค่าไว้ในเครื่องภายใน 24 ชั่วโมง เครื่องฐานข้อมูลต้องจัดการกับบันทึก 1440 (1 ต่อนาที) บันทึกแต่ละแผ่นอาจจะมีบันทึกเวลา (0.0-4 ช่วง) อุณหภูมิ (float), และหมายเลขตรวจจับ (float), ใช้ตัวตรวจจับ (float), ใช้ตัวตรวจจับที่ฝังตัวถังบันทึกด้วย 256 ช่องที่เล็กเกินไป; ที่นี่เราต้องการ [FLT: 10] ด้วยสถิติ 28 ครั้งต่อ 1 (4+4+4+4 สําหรับค่าใช้จ่ายทั่วไป) ใช้ตัวถังน้ําประมาณ 40 ไมโครการควบคุมด้วย KBRPB, ไมโครโค้ดหลายอันมีรหัส 236 แบบ RPB

กลไกนี้สามารถเก็บข้อมูลในรูปแบบวงแหวนแบบบัฟเฟอร์ได้: เมื่อพูลเต็ม สถิติที่เก่าที่สุดจะเขียนทับได้ การเติมตัวชี้ของ "หัว" สําหรับช่องถัดไป และ "หาง" สําหรับบันทึกที่ใช้งานอยู่ ซึ่งหลีกเลี่ยงการใช้ตรรกะรายการเสรีและให้ค่า O( 1) แทรกข้อมูลได้ การค้นสามารถเลือกใช้เวลาการค้นหาได้โดยเพิ่มเวลาให้พอดี หากบันทึกถูกจัดเก็บตามลําดับ

typedef struct {
 uint32_t timestamp;
 float temp_c;
 uint8_t sensor_id;
 uint8_t active; // not needed if using ring buffer
} TemperatureRecord;

#define MAX_LOGS 1440
TemperatureRecord logs[MAX_LOGS];
uint16_t head = 0; // next write position
uint16_t count = 0; // number of valid records

แทรกการอ่าน: [FLT: 12]. สืบค้นเมื่อเวลาจํากัด: ถ้านับ:///N MAXLGS ปูมบันทึกเป็นการเรียงลําดับลําดับจากหัวแบบต่อเนื่องเป็น 1 (Dratical implease images first imate images (FLT: 0). รูปแบบการถอด (TR). enterform [FTIF]. opts [1]. optigritions]. language. language. สืบค้นเมื่อ 1- 2015. สืบค้นเมื่อ 1- 2015. สืบค้นเมื่อ 1- 2015. สืบค้นเมื่อ 1- 2015.

การทดสอบและทําโอปติเมชันบนฮาร์ดแวร์เป้าหมาย

ทดสอบกลไกฐานข้อมูลบนฮาร์ดแวร์ที่ฝังตัวอยู่เสมอ ตัวจําลองการเริ่มเปลี่ยนค่าไม่ได้จํากัด โดยเฉพาะอย่างยิ่งสําหรับวงจรการเขียนแบบแฟลช และรูปแบบการสูญเสียพลังงาน ติดตามการใช้งานของเครื่องติดตามด้วยเครื่องมือวิเคราะห์ และตรวจสอบกรณีขอบ: จัดเก็บข้อมูลเต็ม, การตั้งค่าข้อมูล, ค่าบันทึกค่ากลางที่เสียหาย, การควบคุมแบบทดสอบง่าย ๆ ทํางานอย่างสุ่มเป็นพันๆ ครั้ง, การค้นหา และลบออกไป ในขณะที่เปรียบเทียบกับรุ่นทองคํา

  • [FLT: 0] Fleepleus สวมใส่ - ถ้าเขียนถึง EPRR แฟลชหรือ NOR จํากัด เขียนได้ไม่กี่แสนตัว บุฟเฟ่ ผู้เป็นบัฟเฟอร์วงกลมที่มีชั้นวางจําหน่ายแบบสวมใส่ขยายอายุขัย
  • [FLT: 0] POWER-fail ปลอดภัย[FLT: 1] - ใช้เครื่องหมายสําหรับเชื่อมต่อ: เขียนธงแบบย่อหลังบันทึกสมบูรณ์ เมื่อเริ่มทําการรีเฟรช ให้ตรวจสอบธง หากขาดไป ให้ละทิ้งชุดสุดท้ายและกลับไปใช้รัฐเดิม
  • [FLT: 0]. MEMory พูล – หลีกเลี่ยงการเกิดการซ้ําที่ลึก ฟังก์ชันยังคงเรียกกองว่า ตื้น ใช้บัฟเฟอร์สถิตสําหรับแฟ้ม I/O.

รูปแบบการวน

สร้างเครื่องมือฐานข้อมูลพื้นฐานใน C สําหรับระบบที่ฝังตัวได้นี้ เป็นวิธีจัดการข้อมูลในอุปกรณ์ที่ใช้งานได้จริง โดยเน้นในโครงสร้างข้อมูลพื้นฐานเช่น สระว่ายน้ําและไดรฟเวอร์สําหรับบันทึกข้อมูลแบบคงที่ นักพัฒนาจะประสบความสําเร็จในการดําเนินการ CRUD ได้อย่างมีประสิทธิภาพน้อย เพิ่มดัชนีและความต่อเนื่องเพิ่มเติมเข้ากับรูปแบบดัชนีและพื้นฐานง่าย ๆ ของข้อมูลท้องถิ่น เทคนิคที่อธิบายที่นี่จากตัวตรวจจับขนาดเล็กไปใช้ระบบที่ทันสมัยมากขึ้น และจัดทําการสร้างรากฐานสําหรับการใช้งานฐานข้อมูลขนาดใหญ่เช่น SLLO หรือ BLB