Thiết kế của vi xử lý ARM Cortex M3/4 định nghĩa và phân chia các vùng nhớ khác nhau trong không gian bộ nhớ của vi xử lý. Sau đó, các hãng vi điều khiển như STMicroelectronics sẽ thiết kế các bộ nhớ khác nhau của họ như bộ nhớ FLASH, bộ nhớ SRAM và các ngoại vi khác nhau như ADC, TIMER, USB… vào các vùng nhớ tương ứng với không gian bộ nhớ của vi xử lý. Theo thiết kế của ARM, tất cả các vi xử lý ARM Cortex – M3/4 đều có 32bit địa chỉ bộ nhớ, điều này nghĩa là không gian bộ nhớ tối đa có thể lên đến 4 Gigabyte (GB). Toàn bộ 4GB không gian bộ nhớ được đánh địa chỉ liên tục và được chia thành một số vùng khác nhau. Vùng code là vùng bắt đầu với địa chỉ 0x0000_0000, Sau đó là vùng nhớ dữ liệu SRAM, vùng ngoại vi (Peripheral), và các vùng nhớ khác như External RAM, External Device, Private peripheral bus internal và external, và phần System. Bản đồ bộ nhớ (Memory Map) sẽ chỉ cho người sử dụng biết được tại những vị trí nào của bộ nhớ được dùng để chứa code và vị trí nào của bộ nhớ chứa dữ liệu hay địa chỉ nào của bộ nhớ mà họ có thể truy cập vào các ngoại vi của vi điều khiển
Hình 1. Bản đồ bộ nhớ của Vi xử lý ARM Cortex M4
1. Tổ chức bộ nhớ chương trình
Theo thiết kế của các vi xử lý lõi ARM Cortex M, vùng bộ nhớ chương trình có độ rộng 32 bit và bắt đầu từ địa chỉ 0x0000_0000, tối đa đến địa chỉ 0x1FFF_FFFF, tại địa chỉ 0x0000_0000 sẽ chứa giá trị khởi tạo stack pointer, bảng vector chứa địa chỉ của các exception handler và phần lớn còn lại của vùng này sẽ chứa mã máy của chương trình . Tổng cộng, vùng code có kích thước 512 MB. Các nhà sản xuất vi điều khiển có thể thiết kế vào đây 1 bộ nhớ Flash hoặc bộ nhớ ROM với kích cỡ tối đa là 512MB vào vùng nhớ này. Tuy nhiên thường thì dung lượng 512MB như vậy thì rất lớn, và các nhà sản xuất vi điều khiển sẽ giới hạn bộ nhớ code của họ lại khoảng bé hơn 2MB. Ví dụ như vi điều khiển STM32F411VET6 mình đang sử dụng để làm các đề tài có 512Kbyte bộ nhớ Code.
Hình 2. Vùng bộ nhớ chương trình
Hãng STMicroelectronics thiết kế sử dụng bộ nhớ Flash cho vùng nhớ code của vi điều khiển STM32 và họ thường chia vùng code này làm hai khối chính, khối bộ nhớ chính (main memory) và khối thông tin của nhà sản xuất (information memory).
- Khối bộ nhớ chính có thể được chia làm nhiều page hoặc nhiều sector để quản lý, mỗi page hoặc sector gồm 1 hoặc nhiều KByte.
- Khối bộ nhớ chính được sử dụng để lưu trữ giá trị khởi tạo stack pointer, bảng vector chứa địa chỉ của các exception handler, mã chương trình và các dữ liệu hằng. Bên cạnh đó người dùng cũng có thể sử dụng các vị trí trong khối này để lưu trữ những dữ liệu không bay hơi.
- Khối thông tin cho nhà sản xuất thường chứa sẵn một trình khởi động cho phép vi điều khiển nạp chương trình từ một ngoại vi, ví dụ như vi điều khiển có thể nạp chương trình thông qua ngoại vi UART. Người dùng có thể cấu hình lựa chọn vi điều khiển khởi động từ vùng nhớ này hoặc không thông qua các chế độ khởi động (boot mode). Một số địa chỉ khác của khối này chứa các bit cấu hình cho các chế độ hoạt động, chế độ bảo vệ của bộ nhớ Flash.
ARM quy định bộ nhớ chương trình được đánh địa chỉ liên tục và bắt đầu từ địa chỉ 0x0000_0000, tuy nhiên các nhà sản xuất vi điều khiển có thể đánh địa chỉ bộ nhớ chương trình từ một địa chỉ cơ sở và sử dụng bí danh (memory aliasing) để nối địa chỉ cơ sở với địa chỉ 0x0000_0000. Ví dụ với các dòng STM32 thì địa chỉ cơ sở là 0x0800_0000.
Hình 3. Tổng quan về tổ chức bộ nhớ chương trình
Các hoạt động với bộ nhớ chương trình:
- Hoạt động đọc: Có thể đọc được giá trị trong bộ nhớ flash thông qua địa chỉ trực tiếp.
- Hoạt động ghi: Có thể ghi được giá trị vào bộ nhớ flash theo byte/word/ half-word. Một số vi điều khiển yêu cầu unlock bộ nhớ flash trước khi ghi dữ liệu và lock sau khi ghi.
- Hoạt động xóa: Có thể xóa theo từng page/ từng sector hoặc xóa tất cả Mass Erase. Không thể xóa theo từng địa chỉ.
[KHÓA HỌC ONLINE DO TAPIT THIẾT KẾ: LẬP TRÌNH VI ĐIỀU KHIỂN STM32, VI XỬ LÝ ARM CORTEX – M]
2.Tổ chức bộ nhớ dữ liệu
Vùng bộ nhớ dữ liệu SRAM hay có thể gọi đơn giản là vùng RAM, thường nằm ngay sau vùng bộ nhớ chương trình. SRAM được sử dụng để truy xuất dữ liệu và stack.
Trong quá trình cập nhật chương trình từ xa (FOTA), mỗi khi thiết bị nhúng nhận được một gói tin chứa một phần nội dung của tập tin chương trình ứng dụng từ máy chủ quản lý tập tin thì gói tin này sẽ được lưu ở bộ nhớ dữ liệu (RAM) trước khi được ghi vào bộ nhớ chương trình (Flash).
Tùy thuộc vào tài nguyên phần cứng và thuật toán thiết kế, việc lưu trữ tạm thời chương trình mới vào bộ nhớ RAM có thể được phân làm ba loại sau [1]:
- Lưu trữ một phần: Mỗi khi nhận một gói dữ liệu chứa một phần chương trình ứng dụng, ghi phần dữ liệu này vào vùng nhớ chương trình của bộ nhớ Flash. Phương pháp này đơn giản và sẽ giảm đi các bước trong quá trình cập nhật chương trình nếu các gói tin nhận về có kích cỡ lớn.
- Lưu trữ nhiều phần: Chừa một vùng nhớ RAM để lưu trữ dữ liệu mỗi khi có gói tin đến. Khi vùng này đầy thì ghi phần dữ liệu này vào vùng nhớ chương trình của bộ nhớ Flash và làm trống vùng nhớ RAM để tiếp tục nhận các gói tin khác. Điều này sẽ phức tạp nến các gói tin đến không đúng thứ tự, hoặc thiếu một gói tin dẫn các gói tin bố trí không liên tục. Bộ nhớ Flash được chia thành các vùng nhỏ thường được gọi là page/sector, là đơn vị nhỏ nhất có thể xóa được. Vì vậy tốt nhất kích cỡ bộ nhớ RAM của phương pháp lưu trữ nhiều phần này bằng bội số lần kích cỡ của page/sector của bộ nhớ Flash và khi tải đầy vùng RAM này thì ghi vào Flash và xóa RAM.
- Lưu trữ toàn phần: Lưu trữ toàn bộ chương trình ứng dụng mới trong RAM và chỉ ghi nó vào bộ nhớ flash khi nó đã được tải xuống đầy đủ từ máy chủ. Cách tiếp cận này khắc phục những thiếu sót của 2 cách tiếp cận trước bằng cách giảm thiểu số lần ghi vào bộ nhớ Flash và giảm đi các bước phức tạp trong quá trình FOTA. Tuy nhiên trong thực tế cách này ít được áp dụng vì bộ nhớ RAM khả dụng trên hệ thống thường nhỏ hơn nhiều so với kích cỡ chương trình ứng dụng.
Hình 4. Tổ chức bộ nhớ dữ liệu
Tìm hiểu thêm:
Xem thêm Tổng hợp các bài hướng dẫn Lập trình vi điều khiển STM32 tại đây.
Xem thêm Tổng hợp hướng dẫn Internet of Things với NodeMCU ESP8266 và ESP32 tại đây.
Tài liệu tham khảo:
[1] Brown, Benjamin Bucklin. “Over-the-Air (OTA) Updates in Embedded Microcontroller Applications: Design Trade-Offs and Lessons Learned.“, Analog Devices, 2018.
Thuong Nguyen
Chúc các bạn thành công!