Nguyên văn bởi minh_cly
Xem bài viết
Một số lưu ý khi lập trình trên MCU (not for Computer)
1. Hãy giới hạn tốc độ hiển thị
Mỗi khung hình hiển thị được gọi là một frame, và con người bình thường chúng ta chỉ có thể nhìn thấy 24-30 frame/s, vì vậy hãy giới hạn tốc độ này ít nhất có thể để có tài nguyên thực hiện những tác vụ khác.
2. Hãy tính toán frame tiếp theo ngay sau khi chuyển frame
Một số bạn thường có 1 thói quen thế này:
Hãy thay nó bằng thế này:
t_ref và lệnh thay frame cần phải sớm càng tốt để hiển thị đúng thời gian bởi vì chúng ta ko thể bik chính xác đc thuật toán của bạn nặng bao nhiu.
Một số bạn có thể nói là thuật toán của "tôi" tính sau sau 10ms sau đó hiển thị thì cũng đều thoy, tôi chỉ cần thay t_ref lên đầu, còn lệnh thay frame để cuối vẫn đc. Nhưng các bạn có chắc chắn rằng thuật toán của bạn có tính toán đúng 10ms, vì trong thuật toán của bạn có rất nhìu lệnh if, lệnh for, và những lệnh này có thể làm thay đổi thời gian tính toán rất nhiều.
3. Nếu thuật toán có SIN hoặc COS, hãy tạo một mảng chứa những giá trị có sẵn
Việc tính Sin và Cos trên MCU tốn rất nhìu tài nguyên, nhưng chúng ta ko cần sự chính xác cho lắm, bởi vì LED Cube 8x8x8 thì cũng có 8 đơn vị mỗi chìu. Chúng ta nên vào excel, lập ra 1 mảng tên là Sin, Cos để lưu những giá trị tính sẵn. Đừng lo về RAM, vì nếu bạn khai báo đó là const (hằng số), thì dữ liệu sẽ đc lưu trong program memory.
Kích cỡ của mảng tùy thuộc vào thuật toán và tốc độ hiển thị, có thể đc sử dụng cho nhìu thuật toán khác nhau. Hãy phân tích tham số trong hàm SIN xem có bao nhiu phần tử rời rạc có thể, hay bạn có thể làm gần đúng nó để lấy giá trị gần đúng.
Ví dụ trong hiệu ứng sóng, SIN có tham số là 2*PI*t/T, với tốc độ hiển thị là 30, và T có giá trị là 2 chẳng hạn, thì 1 chu kỳ mấy 60 frame tương ứng vs các giá trị khác nhau của t/T. Vì vậy hãy tạo 1 mảng 60 để lưu giá trị của Sin và Cos.
Một ví dụ khác, thuật toán sử dụng mảng Sin 100 phần tử, thuật toán 2 chỉ sử dụng 60. 2 thuật toán có thể share cho nhau một mảng Sin 100 để tiết kiệm tài nguyên. Nếu thuật toán 1 ko yêu cầu độ chính xác cao, 2 thuật toán có thể sử dụng chung mảng 60 hay thấp hơn cũng được.
1. Hãy giới hạn tốc độ hiển thị
Mỗi khung hình hiển thị được gọi là một frame, và con người bình thường chúng ta chỉ có thể nhìn thấy 24-30 frame/s, vì vậy hãy giới hạn tốc độ này ít nhất có thể để có tài nguyên thực hiện những tác vụ khác.
2. Hãy tính toán frame tiếp theo ngay sau khi chuyển frame
Một số bạn thường có 1 thói quen thế này:
Code:
int fps = 30; // Tốc độ hiển thị float t_ref = get_time(); while (true) { // Bạn nên dùng ngắt timer để giới hạn tốc độ hiển thịfloat t = get_time() - t_ref; if (t > 1.0 / fps) { // Giới hạn tốc độ hiển thị// Tính toán hiệu ứng // Thay frame t_ref = get_time();}}
Code:
t_ref = get_time(); // Thay frame // Tính toán hiệu ứng
Một số bạn có thể nói là thuật toán của "tôi" tính sau sau 10ms sau đó hiển thị thì cũng đều thoy, tôi chỉ cần thay t_ref lên đầu, còn lệnh thay frame để cuối vẫn đc. Nhưng các bạn có chắc chắn rằng thuật toán của bạn có tính toán đúng 10ms, vì trong thuật toán của bạn có rất nhìu lệnh if, lệnh for, và những lệnh này có thể làm thay đổi thời gian tính toán rất nhiều.
3. Nếu thuật toán có SIN hoặc COS, hãy tạo một mảng chứa những giá trị có sẵn
Việc tính Sin và Cos trên MCU tốn rất nhìu tài nguyên, nhưng chúng ta ko cần sự chính xác cho lắm, bởi vì LED Cube 8x8x8 thì cũng có 8 đơn vị mỗi chìu. Chúng ta nên vào excel, lập ra 1 mảng tên là Sin, Cos để lưu những giá trị tính sẵn. Đừng lo về RAM, vì nếu bạn khai báo đó là const (hằng số), thì dữ liệu sẽ đc lưu trong program memory.
Kích cỡ của mảng tùy thuộc vào thuật toán và tốc độ hiển thị, có thể đc sử dụng cho nhìu thuật toán khác nhau. Hãy phân tích tham số trong hàm SIN xem có bao nhiu phần tử rời rạc có thể, hay bạn có thể làm gần đúng nó để lấy giá trị gần đúng.
Ví dụ trong hiệu ứng sóng, SIN có tham số là 2*PI*t/T, với tốc độ hiển thị là 30, và T có giá trị là 2 chẳng hạn, thì 1 chu kỳ mấy 60 frame tương ứng vs các giá trị khác nhau của t/T. Vì vậy hãy tạo 1 mảng 60 để lưu giá trị của Sin và Cos.
Một ví dụ khác, thuật toán sử dụng mảng Sin 100 phần tử, thuật toán 2 chỉ sử dụng 60. 2 thuật toán có thể share cho nhau một mảng Sin 100 để tiết kiệm tài nguyên. Nếu thuật toán 1 ko yêu cầu độ chính xác cao, 2 thuật toán có thể sử dụng chung mảng 60 hay thấp hơn cũng được.
Comment