ak-mcu-base. Base cũ dành cho dự án đang chạy trên nó, hoặc khi cần ngay driver mà base mới chưa có.
1. Bản đồ flash, vẽ đúng tỉ lệ
Cả hai bên đều dành 12K đầu flash cho phần khởi động và để lại 116K cho app. Khác nhau ở cách dùng 12K đó.
Bootloader mới lớn hơn 1.236 B vì thêm CRC32, kiểm header, hai bản ghi trạng thái và chế độ cứu ảnh. Trạng thái boot chuyển sang EEPROM nên vùng BSF 4K nhường lại cho bootloader; app không mất byte nào.
2. Những điểm hơn
2.1 Bootloader và cập nhật firmware
| Hạng mục | Base cũ | ak-mcu-base | Đã kiểm bằng |
|---|---|---|---|
| Toàn vẹn ảnh | Tổng 16 bit của các word, chỉ tính sau khi chép | CRC32 toàn ảnh, tính mỗi lần boot và trước khi cài | Unit test, trên board |
| Nạp nhầm ảnh | Chỉ có magic number trong header | Header mang tên board và địa chỉ nạp; ảnh của board khác bị từ chối ngay khi nhận xong | Unit test |
| Cài hỏng lặp lại | Checksum sai thì reset và thử lại mãi | Tối đa 3 lần, sau đó về chế độ loader chờ nạp | Unit test |
| Mất điện lúc cài | Xoá hết APP rồi chép; lần boot sau dựa vào lệnh còn trong BSF | Trang header của APP xoá đầu tiên, chép cuối cùng: ảnh chép dở luôn "không hợp lệ" | 3.252 điểm cắt điện trên giả lập, cho cả hai kiểu staging |
| Trạng thái boot ↔ app | BSF 4K trong flash, xoá rồi mới ghi | 2 × 32 B trong EEPROM, hai bản ghi luân phiên có số thứ tự | Cắt ở từng byte của lần ghi (65 điểm); trên board: OTA liên tiếp |
| Giao thức nạp | Boot có giao thức UART riêng, app đi đường khác | Một giao thức fw_proto cho cả boot lẫn app, dùng chung UART với shell | Trên board |
Bản mới còn có: tự cài lại từ staging khi APP hỏng, và chế độ AK_STAGING=internal
(APP 58K + staging 58K trong flash trong) cho board không gắn flash SPI. Cả hai mới qua unit test.
2.2 Kernel AK
API giữ nguyên (task_post_*, timer_set, fsm/tsm, bảng task). Mọi thay đổi đều có unit test.
| Hạng mục | Base cũ | ak-mcu-base |
|---|---|---|
| Timer chu kỳ khi một handler chạy lâu | Nạp lại counter = period, bỏ phần trễ nên trôi dần | Mốc hết hạn tuyệt đối, giữ đúng pha |
timer_set() gọi sau handler chạy N ms | Bị trừ luôn N ms đã dồn nên nổ sớm | Tính từ thời điểm gọi |
| Tải của ngắt tick 1 ms | Mỗi ms cấp một message và duyệt cả danh sách timer | Chỉ post khi timer gần nhất đến hạn |
src_task_id của message từ polling task | Mang id của task chạy gần nhất | AK_TASK_IDLE_ID |
| Vòng lặp chính lúc rảnh | Quay liên tục | WFI; kiểm hàng đợi và ngủ trong cùng một critical section |
| Bảng task khai báo sai | pri = 0 ghi ra ngoài mảng | FATAL ngay lúc khởi động |
2.3 Build, kiểm thử và chuyển chip
| Hạng mục | Base cũ | ak-mcu-base |
|---|---|---|
| Tối ưu lúc link (LTO) | Không | Bật mặc định; boot và app nhỏ hơn khoảng 14% |
| Cảnh báo biên dịch | Không ép | -Wall -Wextra -Werror cho mã của base |
| Kiểm thử trên máy tính | Chỉ lớp Modbus | Kernel 16 ca, bootloader và OTA 165 kiểm tra, OTA đầu-cuối trên giả lập ak_sim |
| Phụ thuộc chip | Kernel, boot, app gọi thẳng SPL và lớp Arduino | Mã phía trên HAL không include header của chip; thêm chip là viết port/<chip>/ |
2.4 Số đo trên board
| Phép đo | Kết quả | Ghi chú |
|---|---|---|
OTA ảnh 10,5K qua UART 115200 bằng ak_fw.py | 1,6 s | Gồm cả verify trên board. Trước khi sửa tool là 5,4 s |
| Từ reset tới lúc app chạy, ảnh 11K | 31 ms | Đã gồm CRC toàn ảnh |
Mức dùng pool message pure cao nhất | 2 | Sau nhiều phút chạy; khớp với việc tick không còn post mỗi ms |
Không so trực tiếp được với OTA qua RS485 9600 của base cũ (khoảng 78 s mỗi lượt) vì khác đường truyền và khác cỡ ảnh.
3. Ngang nhau
Bốn thứ dưới đây dễ bị tưởng là điểm mới, nhưng base cũ đã có.
- Console TX không chặn (ring + ngắt TXE): base cũ có sẵn, bản mới thêm ở v1.1.0.
- Ghi flash trong theo half-page từ RAM.
- Watchdog trong bootloader: cũ 32 s, mới 10 s.
- Chỗ cho app: 116K tại
0x08003000, staging trên flash SPI tại0x80000.
4. Còn thiếu so với base cũ
| Thiếu | Ghi chú |
|---|---|
| Driver: nút, còi, OLED, nRF24, EEPROM ngoài, lớp Arduino | Cố ý không mang sang; viết lại theo nhu cầu từng sản phẩm |
| Rollback về ảnh trước | Chỉ có cài lại từ staging |
| Ký số ảnh | Chỉ có CRC: chống hỏng dữ liệu, không chống giả mạo |
| Dự án con | Chưa dự án nào chuyển sang; các dự án hiện có vẫn theo base cũ |
5. Đã kiểm gì trên board
- Boot sang app, shell (
help,ver,info,verify,stat), OTA nhiều lượt qua bootloader 1.1.0. - Chế độ loader 16 s không reset. Dừng lõi 13 s bằng debugger thì watchdog của bootloader reset và quay lại đúng chế độ loader.
- Dồn 40 dòng lệnh khi một lệnh chậm đang chạy: không FATAL, dòng thừa bị bỏ kèm thông báo.