La plataforma NXP MCUXpresso Experiencia de Desarrollo MCXN947 (Parte 5)

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!

1 Like