Chuyển đến nội dung chính

Dùng FreeRTOS cho MCU khác không có trong Demo. (Ex Atmega128)

Bài trước: Cách biên dịch 1 chương trình đơn giản từ ví dụ của FreeRTOS

Atmega 32 chỉ có 32 Kbytes Flash, mà FreeRTOS viết 2 cái Task nháy led thôi mà cũng đã ngốn hết mất 31 Kbytes rồi, còn đâu bộ nhớ mà viết nữa chứ, vậy nên nhu cầu biên dịch nó cho 1 MCU có Flash lớn hơn là cần thiết. Mình đang hướng đến dùng với con Atmega128 với 128 Kbytes tha hồ mà code.
Nhưng chính cái này đã làm mình đau đầu mấy hôm nay, chương trình mình viết lại cho Atmega128 biên dịch đúng rồi, không có lỗi lầm gì cả vậy mà khi nạp vô chip lại không chạy được :((
Và hôm nay vào 1 chiều đầy gió mình đã phát hiện ra được vấn đề nó nằm ở đâu < mừng kinh khủng khiếp > nên viết luôn bài này kẻo lại quên thì khổ.
Để biên dịch cho Atmega 128 thì phải làm những  bước sau:

Bước 1: Vào file makefile ở trong tệp demo, ta sẽ sửa file này đầu tiên. 
              Sửa lại MCU sử dụng từ "MCU = atmega323" thành "MCU =atmega128"
              Sửa lại linker flags từ      "LDFLAGS = -Wl,-Map=$(TARGET).map,--cref"
                                       thành     "LDFLAGS = -Wl,-Map=atmega128.map,--cref"
              Xong. Nhớ lưu lại nhé.

Bước 2: Vì Atmega32 chỉ có 1 USART mà con Atmega128 lại có tận 2 USART nên các thanh ghi chức năng cũng có thay đổi. Chúng ta sẽ sửa chúng ở trong file "serial.c".
(Chú ý: dùng Ctrl + H để tìm và thay thế cho nhanh nhé )
              Tìm tất cả UCSRB thay bằng UCSR0B.
                              UCSRC thay bằng UCSR0C.
                              UBRRL thay bằng UBRR0L.
                              UBRRH thay bằng UBRR0H.
                              SIG_UART_RECV thay bằng SIG_UART0_RECV.
                              SIG_UART_DATA thay bằng SIG_UART0_DATA.
                              UDR thay bằng UDR0.

Xong. Lưu lại và biên dịch thử coi.
À. Cái trên này là mình chuyển về UART0 của con Atmega128 đó, nếu ai không thích chuyển sang UART1 cũng không sao cả.
Chương trình demo nháy led với Atmega128 cho những ai làm theo những bước trên mà vẫn không được nhé. Ex Atmega128


Nhận xét

  1. Cảm ơn bạn rất nhiều! Bài viết của bạn rất chi tiết và dễ hiểu cho những bạn bắt đầu tìm hiểu về FreeRTOS như mình. :)

    Trả lờiXóa

Đăng nhận xét

Bài đăng phổ biến từ blog này

Bắt đầu với FreeRTOS (Bài 1)

NOTE: 1 vài tài liệu mình sử dụng trong bài này là mình sưu tầm được, có thể không có bản quyền, nếu tác giả không muốn đăng lên thì mình sẽ xóa. Trước khi tìm hiểu mọi người có thể biên dịch thử 1 chương trình để lấy khí thế tại  đây. FreeRTOS là 1 hệ điều hành nhúng phù hợp cho các ứng dụng có yêu cầu về thời gian thực 1 cách chặt chẽ. Và vì nó miễn phí, nhỏ gọn và có thể nhúng vào các dòng vi điều khiển thông thường như PIC, AVR, MSP430, ARM...nên mình làm hướng dẫn này cho những ai muốn bắt đầu tìm hiểu về FreeRTOS. Trang chủ của nó  http://www.freertos.org/ Đầu tiên là phải tải FreeRTOS về đã: vào  http://sourceforge.net/projects/freertos/files/   Click vào  Download FreeRTOSV7.5.2.exe (9.3 MB) (thời điểm này bản mới nhất là 7.5.2) để tải về. Sau khi tải về bạn click đúp vào file .exe ấy để giải nén. Ta được 1 folder FreeRTOSV7.5.2. Xong Bước 1  Tiếp theo là nên đọc 1 tài liệu để hiểu sơ qua xem RTOS nó là cái gì và nó hoạt động như thế nào: Các bạn lấy tài l

Chapter 3: Interrupt management (quản lý ngắt).

Bài trước: Chapter 2: Queue Management (Quản lý hàng đợi). Nối tiếp chương 2 về quản lý hàng đợi, hôm nay chúng ta sẽ tìm hiểu về quản lý ngắt. Ngắt là 1 thành phần cực kỳ quan trọng trong lập trình nhúng, nếu bạn đã học qua về vi điều khiển thì chắc không phải nói nhiều về cái này làm gì. Còn nếu chưa thì hiểu nôm na Ngắt là 1 sự kiện mà nó luôn được ưu tiên cao nhất, tức là khi sự kiện ngắt xảy ra thì tất cả mọi sự kiên khác đều phải dừng lại để ngắt thực hiện công việc của mình. Nhưng có 1 sự khác nhau ở ngắt trong FreeRTOS và ngắt thông thường ở chỗ: Khi ngắt thông thường xảy ra nó sẽ nhảy vào hàm ngắt và các công việc cần phải làm đều đặt trong hàm ngắt. Còn ở FreeRTOS thì khi ngắt xảy ra nó sẽ nhảy vào hàm thủ tục ngắt, hàm thủ tục ngắt lại phát đi 1 "tín hiệu" để hàm thực hiện chức năng của ngắt Unblocking và hàm này có Priority cao hơn tất cả các task khác nên nó sẽ thực hiện ngay lập tức. Tín hiệu ở đây chính là Semaphore, có 2 loại Semaphore là Binary Semaph

Chap 1: Task management (Quản lý Task).

Bài trước: Bắt đầu với FreeRTOS (Bài 2) 1 tháng rồi bận bịu quá nà. Bài này sẽ tổng hợp lại những thứ cần chú ý ở trong Chap 1 cuốn "Using the freertos real time kernel" Câu 1: Task là gì? và được tạo ra thế nào? Task được hiểu nôm na như là 1 chương trình thực hiện 1 nhiệm vụ nào đó. 1 Task gồm có: tên, chức năng, giá trị ưu tiên, độ sâu stack, task handle (như kiểu cái móc để tác động ấy), biến tác động vào task. Để tạo task thì đầu tiên phải định nghĩa chức năng của nó trước, cấu trúc hàm cơ bản như sau: void ATaskFunction(void *pvParameters) { // Khởi tạo biến ở đây for( ; ; ) { // Chức năng thực hiện ở đây } } Ví dụ: void vTask1(void *pvParameters) {                const char *pcTaskName = "This is Task 1 \r\n";                for ( ; ; ) { vPrintString(pcTaskName); } } Sau đó phải dùng hàm xTaskCreate()