Chương 2. KIẾN TRÚC VI XỬ LÝ ARM
2.1. Kiến trúc và các chế độ xử lý
2.1.4. Mô hình bộ nhớ
Một hệ thống nhúng có các mức bộ nhớ khác nhau để lưu trữ và thực hiện câu lệnh. Các mức bộ nhớ khác nhau được phân biệt dựa trên giá thành, hiệu năng và mức độ tiêu thụ năng lượng.
a) Phân cấp bộ nhớ
Mọi hệ thống máy tính phải có bộ nhớ sắp xếp theo phân mức. Hình 2.6 dưới cho thấy sự đánh đổi giữa các yếu tố khác nhau của bộ nhớ: bộ nhớ đệm (cache) ở gần với lõi vi xử lý ARM nhất và bộ nhớ thứ cấp ở cách xa vi xử lý nhất. Bộ nhớ càng gần với lõi vi xử lý, giá thành càng tăng và dung lượng càng giảm.
43
Hình 2.6: Phân cấp bộ nhớ
Bộ nhớ đệm được đặt giữa bộ nhớ chính và lõi vi xử lý. Nó được sử dụng để tăng tốc độ truyền dữ liệu giữa vi xử lý và bộ nhớ chính. Mặc dù bộ nhớ đệm hỗ trợ hiệu năng của hệ thống nói chung, nó không giúp nhiều đối với phản hồi của hệ thống thời gian thực. Chú ý rằng nhiều hệ thống nhúng nhỏ không cần dùng đến bộ nhớ đệm.
Bộ nhớ chính có dung lượng lớn – khoảng từ 256 KB đến 256 MB (hoặc lớn hơn), phụ thuộc vào ứng dụng – và nó thường nằm trên các chip riêng biệt. Các lệnh truy cập bộ nhớ chính trừ khi giá trị đã nằm sẵn trong bộ nhớ đệm. Bộ nhớ thứ cấp có tốc độ truy cập chậm nhất nhưng dung lượng lại lớn nhất.
b) Kích thước từ nhớ
Kích thước từ nhớ là số lượng bits bộ nhớ trả về sau mỗi lần truy cập – thông thường là 8, 16, 32 hay 64 bits. Kích thước từ nhớ có ảnh hưởng trực tiếp lên tổng thể giá thành và hiệu năng của bộ nhớ.
Giả sử ta có câu lệnh 32 bit và chip nhớ rộng 16 bits, vi xử lý sẽ phải truy cập vào bộ nhớ hai lần để lấy một câu lệnh. Điều đó rõ ràng làm giảm tốc độ và hiệu năng của hệ thống, nhưng giá thành của bộ nhớ 16 bit thì rẻ hơn so với bộ nhớ 32 bit.
44
c) Các kiểu bộ nhớ
Một số loại bộ nhớ có thể được kể đến như:
Bộ nhớ chỉ đọc (ROM) là loại bộ nhớ ít linh hoạt nhất vì nội dung của nó được ghi từ lúc sản xuất và không thể tái lập trình. ROMs được dùng trong các ứng dụng số lượng lớn và không yêu cầu cập nhật. Nhiều thiết bị sử dụng bộ nhớ ROM để chứa code khởi động.
Flash ROM có thể dùng để ghi hoặc đọc dữ liệu, nhưng việc ghi lên bộ nhớ Flash khá là chậm nên ta thường không dùng nó để lưu các dữ liệu động.
Chức năng chính của nó là để chứa phần mềm của thiết bị hay lưu trữ các biến cố định. Quá trình xóa và ghi lên bộ nhớ flash ROM được điều khiển bởi phần mềm, không cần sự tham gia của phần cứng. Flash ROM hiện nay là loại bộ nhớ phổ biến nhất và đang được sử dụng để thay thế cho bộ nhớ thứ cấp.
RAM động (DRAM) là loại RAM được sử dụng chủ yếu trong các thiết bị.
Giá thành chế tạo cho mỗi megabyte là rẻ nhất so với các loại RAM khác.
DRAM cho phép làm mới các ô nhớ cứ vài mili giây, do đó ta cần phải thiết lập bộ điều khiển DRAM trước khi sử dụng bộ nhớ.
RAM tĩnh (SRAM) nhanh hơn DRAM truyền thống, nhưng diện tích chip của SRAM lớn hơn của DRAM. SRAM không yêu cầu làm tươi bộ nhớ.
Thời gian truy cập của SRAM ngắn hơn nhiều so với DRAM tương ứng vì SRAM không cần một khoảng dừng giữa các lần truy cập bộ nhớ. Do giá thành cao, nó thường được dùng chủ yếu cho các tác vụ tốc độ cao, ví dụ như bộ nhớ đệm.
RAM động đồng bộ (SDRAM) là một trong các loại DRAM. Nó có thể hoạt động ở tốc độ clock cao hơn so với bộ nhớ thông thường. SDRAM tự đồng bộ chính nó với bus vi xử lý vì nó cũng được cấp xung clock.
d) Bản đồ bộ nhớ trong
Bản đồ bộ nhớ trong vi điều khiển lõi ARM được mô tả như trong Hình 2.7.
Trong đó, vi xử lý Cortex – M3 có không gian nhớ cố định; các thành phần như NVIC hay MPU có cùng không gian nhớ trong các sản phẩm Cortex - M3. Định nghĩa bản đồ bộ nhớ cho phép phân biệt các sản phẩm dựa trên lõi Cortex – M3 với các sản phẩm khác.
45
Hình 2.7: Bản đồ bộ nhớ trong
Một số vùng bộ nhớ được hoạch định sẵn như các thành phần gỡ lỗi. Chúng được xác định bên trong vùng nhớ ngoại vi riêng. Các thành phần gỡ lỗi bao gồm:
Đơn vị xác định điểm dừng và vá lỗi
Đơn vị dò vết và xem dữ liệu
Bộ macro dò vết thiết bị
Đơn vị dò vết giao diện cổng
Bộ macro dò vết nhúng
Bảng ROM.
Vi xử lý Cortex – M3 có 4 GB không gian địa chỉ. Mã chương trình được ghi trong vùng code, khu vực RAM tĩnh (Static Random Access Memory), hay vùng RAM ngoài (external RAM). Tuy nhiên, đặt mã lệnh của chương trình trong vùng
46
nhớ mã lệnh là tốt nhất, việc lấy lệnh và truy cập dữ liệu được thực hiện đồng thời trên hai bus riêng biệt.
Khoảng bộ nhớ SRAM được sử dụng để kết nối SRAM nội. Việc truy cập vào khu vực này được thực hiện thông qua giao tiếp bus hệ thống. Trong vùng nhớ này, một khoảng 32-MB được định nghĩa là bit-band alias. Trong khoảng vùng nhớ 32-MB bit-band alias này, mỗi địa chỉ từ nhớ sẽ ứng với một bit trong 1-MB bit- band region. Truy cập đọc ghi dữ liệu tới khoảng nhớ bit-band alias này sẽ được chuyển thành thao tác READ – MODIFY – WRITE đối với bit-band region, cho phép người lập trình set hay clear từng bit riêng biệt trong vùng nhớ. Thao tác bit- band chỉ áp dụng với việc truy cập dữ liệu chứ không áp dụng với thao tác lấy lệnh.
Bằng cách thiết lập các bits (Boolean) trong vùng nhớ bit-band, ta có thể đóng gói dữ liệu Boolean trong một từ và truy cập từng bit một cách độc lập thông qua bit- band alias, qua đó tiết kiệm không gian bộ nhớ mà không cần phải thao tác READ – MODIFY – WRITE ở phần mềm.
Một khối địa chỉ 0.5 GB được thiết lập để dành cho ngoại vi. Tương tự với vùng SRAM, vùng này cũng hỗ trợ bit-band alias và được truy cập thông qua bus hệ thống. Tuy nhiên, việc thực hiện lệnh trong vùng này không được cho phép. Hỗ trợ về bit-band trong vùng này giúp cho việc thay đổi các bit điều khiển và trạng thái của ngoại vi dễ dàng hơn.
Hai khối 1-GB địa chỉ bộ nhớ được thiết lập cho RAM ngoài và các thiết bị gắn ngoài. Điểm khác biệt ở đây là việc thực hiện chương trình ở vùng thiết bị ngoài không được cho phép, và có một số khác biệt nữa đối với các giao tiếp bộ nhớ đệm cache.
0.5 GB cuối cùng trong bộ nhớ được dành cho các linh kiện mức hệ thống, bus, và các ngoại vi hệ thống của nhà cung cấp. Có hai loại của bus ngoại vi riêng (Private peripheral bus - PPB):
Advanced High – Performance Bus (AHB) PPB cho dòng Cortex – M3, bao gồm NVIC, FPB, DWT và ITM
Advanced Peripheral Bus (APB) PPB, dành cho các thiết bị nội APB và ngoại vi bên ngoài của Cortex – M3; Cortex – M3 cho phép nhà sản xuất chip thêm các ngoại vi APB trên trên kênh bus ngoại vi riêng thông qua giao tiếp APB.
NVIC được thiết lập trong vùng nhớ không gian điều khiển hệ thống. Ngoài các chức năng điều khiển ngắt, vùng nhớ này cũng chứa các thanh ghi dành cho SYSTICK, MPU và điều khiển gỡ lỗi.
47
Các dải địa chỉ ô nhớ chưa được sử dụng của nhà sản xuất có thể được truy cập thông qua giao diện bus hệ thống được mô tả như trong Hình 2.8. Tuy nhiên, việc thực hiện lệnh trong vùng này không được cho phép.
Hình 2.8: Không gian điều khiển hệ thống
Bản đồ bộ nhớ chỉ ra từng vùng nhớ có chức năng gì. Bên cạnh việc giải mã để xem khối nhớ hay thiết bị nào được truy cập, bản đồ bộ nhớ cũng định nghĩa các thuộc tính nhớ. Các thuộc tính nhớ bao gồm:
Bufferable: Ghi vào bộ nhớ có thể được thực hiện bởi bộ đệm ghi, trong khi lõi vi xử lý tiếp tục thực hiện câu lệnh tiếp theo
Cacheable: Dữ liệu thu được sau khi đọc bộ nhớ có thể được copy sang bộ nhớ đệm, giúp cho lần truy cập sau sẽ có tốc độ nhanh hơn.
Executable: Lõi vi xử lý có thể lấy và thực hiện lệnh từ vùng nhớ này
Sharable: Dữ liệu trong vùng nhớ này có thể được chia sẻ bởi các bus. Hệ thống nhớ cần đảm bảo sự gắn kết dữ liệu giữa các bus trong vùng nhớ chia sẻ.
Giao tiếp bus Cortex - M3 xuất các thông tin thuộc tính bộ nhớ đến hệ thống bộ nhớ đối với mỗi câu lệnh thực hiện và chu kì truyền dữ liệu. Thuộc tính bộ nhớ mặc định có thể được ghi đè lên nếu có module MPU và thiết lập của vùng MPU được lập trình khác so với mặc định. Mặc dù lõi vi xử lý Cortex – M3 không có bộ nhớ đệm hay điều khiển đệm, một đơn vị nhớ đệm có thể được thêm vào trên vi điều khiển, sử dụng các thông tin về thuộc tính nhớ để định nghĩa các hoạt động của việc truy cập bộ nhớ. Thêm vào đó, thuộc tính bộ nhớ đệm cũng có thể ảnh hưởng đến hoạt động của bộ điều khiển nhớ đối với các bộ nhớ trên chip, phụ thuộc vào bộ điều khiển nhớ sử dụng bởi nhà sản xuất chip. Thuộc tính truy cập bộ nhớ với mỗi vùng nhớ như sau:
Vùng nhớ mã lệnh (0x00000000 – 0x1FFFFFFF): Vùng nhớ cho phép thực hiện chương trình, và thuộc tính đệm ở đây là cho phép ghi (write through - WT). Ta cũng có thể khởi tạo dữ liệu trong vùng bộ nhớ này. Nếu các thao tác dữ liệu có trong vùng nhớ này, chúng sẽ hoạt động thông qua
48
giao diện bus dữ liệu. Truyền dữ liệu ghi đối với vùng nhớ này có thuộc tính đệm.
Vùng nhớ SRAM (0x20000000 – 0x3FFFFFFF): Vùng nhớ này được dành cho SRAM trên chip. Dữ liệu ghi vào vùng nhớ này có thuộc tính đệm, và thuộc tính bộ nhớ đệm là ghi ngược và ghi phân vùng (write back, write allocated – WB, WA). Dữ liệu vùng nhớ này có thể được thực hiện, do đó ta có thể copy chương trình vào đây và chạy.
Vùng ngoại vi (0x40000000 – 0x5FFFFFFF): Vùng nhớ này được dành cho ngoại vi. Truy cập vào vùng nhớ này không được đệm (non-cacheable).
Ta không thể thực hiện câu lệnh trong vùng này (Execute Never – XN).
Vùng nhớ RAM ngoài (0x60000000 – 0x7FFFFFFF): Vùng nhớ này được dành cho bộ nhớ trên chip hay bộ nhớ ngoài. Việc truy câp là có thể đệm được (WB - WA), và ta có thể thực hiện mã lệnh trong vùng này.
Vùng nhớ RAM ngoài (0x80000000 – 0x9FFFFFFF): Vùng nhớ này được dành cho bộ nhớ trên chip hay bộ nhớ ngoài. Việc truy câp là có thể đệm được (WB - WA), và ta có thể thực hiện mã lệnh trong vùng này.
Thiết bị ngoài (External devices) (0xA0000000 – 0xBFFFFFFF): Vùng nhớ này được dành cho các thiết bị ngoài và bộ nhớ chia sẻ được (shared memory). Đây là một vùng không thực hiện được.
Thiết bị ngoài (0xC0000000 – 0xDFFFFFFF): Vùng nhớ này được dành cho bộ nhớ trên chip hay bộ nhớ ngoài. Việc truy câp là có thể đệm được (WB - WA), và ta có thể thực hiện mã lệnh trong vùng này.
Vùng nhớ hệ thống (0xE0000000 – 0xFFFFFFFF): Vùng nhớ này cho các ngoại vi riêng và các thiết bị của từng nhà sản xuất. Nó là vùng nhớ không thực hiện được.
e) Quyền hạn truy cập bộ nhớ mặc định
Bản đồ bộ nhớ Cortex – M3 có một thiết lập mặc định. Nó ngăn chặn người dùng phổ thông (non-privileged) truy cập vào không gian điều khiển bộ nhớ như NVIC. Quyền hạn truy cập bộ nhớ mặc định được sử dụng khi không có MPU hay MPU bị bất hoạt. MPU sẽ quyết định truy cập người dùng có được cho phép truy cập hay không.
f) Điều khiển bộ nhớ
Điều khiển bộ nhớ kết nối các loại bộ nhớ khác nhau đến bus vi xử lý. Khi khởi động, bộ điều khiển bộ nhớ được cấu hình trong phần cứng, cho phép các thiết bị nhớ hoạt động. Các thiết bị nhớ này cho phép các đoạn mã lệnh khởi động được thực hiện. Một số thiết bị nhớ phải được thiết lập bởi phần mềm, ví dụ như khi sử
49
dụng DRAM, ta cần phải thiết lập thời gian và tần số làm tươi bộ nhớ trước khi truy cập.