Aqui mostraremos como se utiliza Zephyr en la plataforma NXP MCUXpresso Experiencia de Desarrollo MCXN947
El siguiente diagrama ilustra el NXP MCUXpresso Experiencia de Desarrollo MCXN947,
Primero se procede a instalar Zephyr como se muestra en el articulo anterior. Proceda a construir el demo de Zephyr de C++ como sigue,
/**
* @file C++ Synchronization demo. Uses basic C++ functionality.
*/
#include <stdio.h>
#include <zephyr/kernel.h>
#include <zephyr/arch/cpu.h>
#include <zephyr/sys/printk.h>
/**
* @class semaphore the basic pure virtual semaphore class
*/
class semaphore {
public:
virtual int wait(void) = 0;
virtual int wait(int timeout) = 0;
virtual void give(void) = 0;
};
/* specify delay between greetings (in ms); compute equivalent in ticks */
#define SLEEPTIME 500
#define STACKSIZE 2000
struct k_thread coop_thread;
K_THREAD_STACK_DEFINE(coop_stack, STACKSIZE);
/*
* @class cpp_semaphore
* @brief Semaphore
*
* Class derives from the pure virtual semaphore class and
* implements it's methods for the semaphore
*/
class cpp_semaphore: public semaphore {
protected:
struct k_sem _sema_internal;
public:
cpp_semaphore();
virtual ~cpp_semaphore() {}
virtual int wait(void);
virtual int wait(int timeout);
virtual void give(void);
};
/*
* @brief cpp_semaphore basic constructor
*/
cpp_semaphore::cpp_semaphore()
{
printk("Create semaphore %p\n", this);
k_sem_init(&_sema_internal, 0, K_SEM_MAX_LIMIT);
}
/*
* @brief wait for a semaphore
*
* Test a semaphore to see if it has been signaled. If the signal
* count is greater than zero, it is decremented.
*
* @return 1 when semaphore is available
*/
int cpp_semaphore::wait(void)
{
k_sem_take(&_sema_internal, K_FOREVER);
return 1;
}
/*
* @brief wait for a semaphore within a specified timeout
*
* Test a semaphore to see if it has been signaled. If the signal
* count is greater than zero, it is decremented. The function
* waits for timeout specified
*
* @param timeout the specified timeout in ticks
*
* @return 1 if semaphore is available, 0 if timed out
*/
int cpp_semaphore::wait(int timeout)
{
return k_sem_take(&_sema_internal, K_MSEC(timeout));
}
/**
* @brief Signal a semaphore
*
* This routine signals the specified semaphore.
*/
void cpp_semaphore::give(void)
{
k_sem_give(&_sema_internal);
}
cpp_semaphore sem_main;
cpp_semaphore sem_coop;
void coop_thread_entry(void)
{
struct k_timer timer;
k_timer_init(&timer, NULL, NULL);
while (1) {
/* wait for main thread to let us have a turn */
sem_coop.wait();
/* say "hello" */
printk("%s: Hello World!\n", __FUNCTION__);
/* wait a while, then let main thread have a turn */
k_timer_start(&timer, K_MSEC(SLEEPTIME), K_NO_WAIT);
k_timer_status_sync(&timer);
sem_main.give();
}
}
int main(void)
{
struct k_timer timer;
k_thread_create(&coop_thread, coop_stack, STACKSIZE,
(k_thread_entry_t) coop_thread_entry,
NULL, NULL, NULL, K_PRIO_COOP(7), 0, K_NO_WAIT);
k_timer_init(&timer, NULL, NULL);
while (1) {
/* say "hello" */
printk("%s: Hello World!\n", __FUNCTION__);
/* wait a while, then let coop thread have a turn */
k_timer_start(&timer, K_MSEC(SLEEPTIME), K_NO_WAIT);
k_timer_status_sync(&timer);
sem_coop.give();
/* Wait for coop thread to let us have a turn */
sem_main.wait();
}
return 0;
}
desde el ambiente virtual,
(venv) DigiKey_Coffee_Cup # /zephyrproject/zephyr$ west build -b frdm_mcxn947/mcxn947/cpu0 samples/cpp/cpp_synchronization/
-- west build: generating a build system
Loading Zephyr default modules (Zephyr base).
...
...
[174/174] Linking CXX executable zephyr/zephyr.elf
Memory region Used Size Region Size %age Used
FLASH: 31220 B 2 MB 1.49%
RAM: 6800 B 320 KB 2.08%
SRAMX: 0 B 96 KB 0.00%
IDT_LIST: 0 B 32 KB 0.00%
Finalmente programelo como sigue,
(venv) DigiKey_Coffee_Cup # zephyrproject/zephyr$ west flash
-- west flash: rebuilding
ninja: no work to do.
-- west flash: using runner linkserver
RUNNER - gdb_port = 3333, semih port = 8888
LinkServer: /usr/local/LinkServer/LinkServer, version v26.6.137
INFO: Exact match for MCXN947:FRDM-MCXN947 found
INFO: Selected device MCXN947:FRDM-MCXN947
INFO: Selected probe #1 MB52CKWLSWQZA (MCU-LINK FRDM-MCXN947 (r0E7) CMSIS-DAP V3.172)
INFO: MCU-Link firmware update `check`: Probe ([MB52CKWLSWQZA] [MCU-LINK FRDM-MCXN947 (r0E7) CMSIS-DAP V3.172]) is already running the same firmware version as the included firmware version [3.172]
INFO: Selected device matches probe's target identification info
...
...
En un terminal de minicom observara lo siguiente,
Welcome to minicom 2.10
OPTIONS: I18n
Port /dev/ttyACM0, 10:18:59 [U]
Press CTRL-A Z for help on special keys
*** Booting Zephyr OS build v4.4.0-8487-g17939cff6553 ***
main: Hello World!
coop_thread_entry: Hello World!
main: Hello World!
coop_thread_entry: Hello World!
main: Hello World!
coop_thread_entry: Hello World!
main: Hello World!
coop_thread_entry: Hello World!
main: Hello World!
coop_thread_entry: Hello World!
...
Hemos concluido con este demo de C++ en Zephyr en esta plataforma de NXP. La plataforma bien conocida NXP MCUXpresso Experiencia de Desarrollo MCXN947 es de bajo costo pero tiene muchas aplicaciones en diversas areas, y está disponible en DigiKey. Mantenganse sintonizado para nuestro próximo artículo.
Que tenga un buen día!

