Title Image

Blog Logo

Multicore - Raspberry Pico

🌱 Multicore - Raspberry Pico

    Ở post trước mình đã giới thiệu về Vi điều khiển Multicore và các ứng dụng của nó. Post này mình sẽ giới thiệu về một vi điều khiển Multicore mà mình đang sở hữu, đó là vi điều khiển Raspberry Pico (RP2040).

    👉 Giới thiệu về Multicore trong Vi điều khiển RP2040 (Raspberry Pico)

    Tham khảo Reference Manual Vi điều khiển RP2040, chúng ta có thể bắt gặp sơ đồ khối sau:

RP2040

    Có thể thấy trong processor của vi điều khiển, chúng ta bắt gặp 2 khối Proc0 và Proc1, biểu thị cho 2 core M0+ của RP2040, được kết nối với các thành phần khác như DMA, internal memory và các peripherals qua các bus AHB/APB.

    Nhìn chung, về hoạt động, 2 core này sẽ tác động đến các ngoại vi một cách riêng biệt, tức là sử dụng chung các ngoại vi của Vi điều khiển như GPIO, UART, SPI, Interrupt ... Tuy nhiên, mỗi core lại có những ngoại vi core riêng (SCB, MPU, ...). 

    👉 Vậy, để các core có thể sử dụng chung các ngoại vi, bộ nhớ, ... mà không bị hiện tượng xung đột, chúng ta cần có những cơ chế riêng để đảm bảo hoạt động của chương trình là an toàn nhất. 

    Cơ chế thường được sử dụng nhất đó chính là Semaphore. Cơ chế cũng gần tương tự như Semaphore trong multi-task, vì vậy, các bạn có thể tham khảo bài viết trước của mình về Semaphore tại đây: 

    👉 Tương tác giữa 2 Cores

    Ngoài trường hợp các core tương tác với ngoại vi, bộ nhớ chung trong những ứng dụng cần chạy Multicore đồng thời, trong một số ứng dụng, chúng ta cần một cơ chế để giao tiếp giữa 2 Cores (Đối với RP2040 là 2 core Cortex M0+). 

    Đối với RP2040, có 2 bộ đệm FIFO có thể được truy cập bởi các core. Bộ đệm FIFO hoạt động theo cơ chế First In - First Out, tức là vào trước ra trước (mình sẽ giới thiệu kỹ hơn về FIFO trong embedded ở những bài viết sau). Với ứng dụng này, chỉ đơn giản là dữ liệu nào được ghi vào bộ đệm trước sẽ được đọc ra trước. 

    Với FIFO trong RP2040, có 2 bộ đệm, mỗi bộ đệm chỉ có thể được ghi vào bằng một core, và được đọc ra bởi core còn lại. Hoạt động ghi vào bộ đệm gọi là "Push", còn hoạt động đọc dữ liệu từ bộ đệm gọi là "Pop"

Core

    Vì mỗi bộ đệm chỉ cho phép đọc/ghi từ một core, vì vậy có thể coi 2 bộ đệm FIFO này như 2 dây TX, RX của giao thức UART. 

    👉 Ví dụ về lập trình Multicore

    Dưới đây mình có ví dụ về lập trình Multicore với vi điều khiển RP2040 (Raspberry Pico). Một chương trình đơn giản sử dụng Sema4 để điều khiển hoạt động của 2 core.

  • Phần mềm sử dụng: Thonny.
  • Code mẫu tham khảo: Sema4.

    Chúc các bạn học tập tốt 😊

⇐ Multicore Microcontrollers

Đăng nhận xét

0 Nhận xét