Tối ưu kích thước Firmware - Optimize code size

Mới viết thêm mấy tính năng mới, build code thấy trình biên dịch (compliler) báo thiếu bộ nhớ. Muốn giảm kích thước sử dụng của chương trình, giờ không nhẽ đọc lại hết đống code cũ để tối ưu thì mất thời gian quá. Cứ sửa xíu build lại rồi ngó xem giảm được bao nhiêu (hehe, cách lúc mình mới học lập trình là như thế)
 
Cần có phương án để nhanh chóng tìm hàm (function) hay biến (variable) đang chiếm nhiều bộ nhớ nhiều nhất để tập trung tối ưu mới là thượng sách. 
 
Mà các bạn lưu ý nhé:
  • Hàm: Thường lưu ở Flash (trừ mấy trường hợp dị biệt thì redirect lên RAM để chạy).
  • Biến: Có loại chỉ lưu ở RAM, có loại vừa RAM vừa Flash, có loại nằm lên Stack.
  • Chi tiết các bạn đọc thêm bài này nhé: AK Embedded Base Kit - STM32L151 - Application Startup Code
Phương án đây !
Trình biên dịch cung cấp nhiều hàng (tool) cho mình sử dụng, trong đó có cái nm (name mangling) mình cũng đek biết dịch ra kiểu gì, google nó dịch là "tên xáo trộn" đkm :) , thôi dịch đại "nờ mờ" cho lành.
 
nờ mờ dùng để liệt kê hết tất cả các symbol trong chương trình phần mềm của bạn bao gồm địa chỉ, kích thước và tên (hàm hoặc biến). Chi tiết thì các bạn đọc ở cái link đính kèm ở trên nha, bài đó mình viết cũng dày công lắm.
 
Thế là xong, hết phim, nờ mờ nó liệt kê rồi, bonus thêm các option xếp sắp nữa, gõ bụp cái là biết được cái nào ăn bộ nhớ nhiều thì mình vào mà tẩn là OK.
 
Ví dụ ngay cho các bạn dễ hình dung:
 
Trên source base AK Embedded Base Kit mình có sẵn lệnh để list ra tất cả các symbol: 
 
make sym

 

ak embedded base kit - make sym

Chi tiết thực hiện (trông hơi lằng nhằng xíu):

ak embedded base kit - make sym detail

 
Kết quả sau khi thực hiện lệnh trên tất cả các symbol sẽ được để trong file build_ak-embedded-base-kit-stm32l151-application.sym. Giờ mình mở file ra xem thôi, file dài nên mình chỉ chụp khúc đầu với khúc cuối thôi nhé.
 
Khúc đầu !

ak embedded base kit - symbol list head

Khúc cuối !

ak embedded base kit - symbol list tail

 

Giả định là mình chọn 2 cái tô vàng để tối ưu:

1: 0x20001260 - Địa chỉ của biến; 0x380 - Kích thước của biến; msg_pure_pool là tên biến, soi vào code thì nó đây !

ak embedded base kit - msg pure pool

2. 0x0800603C - Địa chỉ của hàm; 0x580 - Kích thước của hàm; xvfprintf - tên hàm, soi code thì nó đây !

ak embedded base kit - xvfprintf

 

Vậy là mình tìm được các biến hoặc hàm đang chiếm bộ nhớ lớn để tập trung vào sửa để giảm bộ nhớ một cách nhanh chóng.

Các thắc mắc các bạn gửi về:

 

Bình luận