Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create freertos port #13

Open
wants to merge 32 commits into
base: develop
Choose a base branch
from
Open

Create freertos port #13

wants to merge 32 commits into from

Conversation

leanfrancucci
Copy link
Member

No description provided.

@leanfrancucci
Copy link
Member Author

Después de hacer un análisis de shared y del port para freertos, aporto algunas ideas para resolverlo:

  1. Sabemos que main() no puede cambiarse porque es una app cross, tenemos que lidiar desde el port (rkhport.c) y el bsp (bsp_shared.c)
  2. En bsp_shared.c podemos plantear bsp_init() como:
bsp_init(...)
{
    ...
    rkh_fwk_init();
    RKH_FILTER_*;
    RKH_TRC_OPEN();
}
  1. En rkhport.c:
  • rkh_fwk_init() es responsable de establecer dónde se ejecuta el tick de RKH (RKH_TIM_TICK()) para manejar los timers. En freertos tenemos tres posibilidades:
    • Desde la callback de un software timer de freertos. Esta se ejecuta en contexto de tarea. Es mi opción favorita
    • Desde una tarea específica que ejecuta un loop con un retardo. Similar a lo que hacía rkh_fwk_enter()
    • Desde el hook de la función tick de freertos. Esta se ejecuta en contexto de ISR
rkh_fwk_init(...)
{
    /* There are 3 alternatives to execute RKH_TIM_TICK() */
    /* 1. From a FreeRTOS software timer (Task context) */ /* <- favorite */
    /* 2. From a specific task (Task context) */
    /* 3. From FreeRTOS tick hook function (ISR context) */
}
  • rkh_fwk_enter() es responsable principalmente de llamar al scheduler del OS
rkh_fwk_enter(...)
{
    RKH_HOOK_START();   /* start-up callback */
    RKH_TR_FWK_EN();
    vTaskStartScheduler();
    RKH_HOOK_EXIT();    /* cleanup callback */
}

@cmancon
Copy link
Collaborator

cmancon commented Jun 16, 2020

@leanfrancucci algunos comentarios sin sopesar completamente cada opción:

  1. Sabemos que main() no puede cambiarse porque es una app cross, tenemos que lidiar desde el port (rkhport.c) y el bsp (bsp_shared.c)

Estoy de acuerdo con lo anterior, siempre y cuando no afecte negativamente al port. Es decir, terminar haciendo un port a medida para una app y un main en particular. No creo que suceda pero me refiero a no tener completamente cerrada la opción de hacer una modificación en un main, mientras que la misma sea una abstracción compatible con todas las plataformas. Lo planteo en el sentido de no sesgar la solución, no por alguna razón técnica.

  1. En bsp_shared.c podemos plantear bsp_init() como:
bsp_init(...)
{
    ...
    rkh_fwk_init();
    RKH_FILTER_*;
    RKH_TRC_OPEN();
}

Si no me equivoco, el planteo es mantener el bsp_init() como se encuentra en la actualidad.

  1. En rkhport.c:
  • rkh_fwk_init() es responsable de establecer dónde se ejecuta el tick de RKH (RKH_TIM_TICK()) para manejar los timers. En freertos tenemos tres posibilidades:

    • Desde la callback de un software timer de freertos. Esta se ejecuta en contexto de tarea. Es mi opción favorita
    • Desde una tarea específica que ejecuta un loop con un retardo. Similar a lo que hacía rkh_fwk_enter()
    • Desde el hook de la función tick de freertos. Esta se ejecuta en contexto de ISR
rkh_fwk_init(...)
{
    /* There are 3 alternatives to execute RKH_TIM_TICK() */
    /* 1. From a FreeRTOS software timer (Task context) */ /* <- favorite */
    /* 2. From a specific task (Task context) */
    /* 3. From FreeRTOS tick hook function (ISR context) */
}

Concuerdo con la idea y preferencia del Software Timer.

  • rkh_fwk_enter() es responsable principalmente de llamar al scheduler del OS
rkh_fwk_enter(...)
{
    RKH_HOOK_START();   /* start-up callback */
    RKH_TR_FWK_EN();
    vTaskStartScheduler();
    RKH_HOOK_EXIT();    /* cleanup callback */
}

Me genera interrogantes de la compatibilidad del port cuando la aplicación sea parte no reactiva y parte reactiva.

Por otra parte, tu análisis sugiere que no es necesaria la función rkh_startupTask(). ¿Entendí bien?

@cmancon cmancon closed this Jun 16, 2020
@cmancon cmancon reopened this Jun 16, 2020
@cmancon
Copy link
Collaborator

cmancon commented Jun 16, 2020

Perdón, botón equivocado... :S

@leanfrancucci
Copy link
Member Author

leanfrancucci commented Jun 16, 2020

@cmancon respecto del main() y su relación con el port.
Si la aplicación está basada en el framework entonces el main() generalmente tiene la forma del de shared. Y además se relaciona de manera similar con el bsp y el port.

Ahora, a esta arquitectura se le pueden sumar, sin ningún problema, tareas que no usan el framework.

Por otro lado, si se requiere usar el framework con una aplicación existente que usa freertos entonces puede que el port deba modificarse o incluso se requiera crear otro diferente. Eso lo veremos cuando nos enfrentemos con el problema. Por ahora me inclino por resolver el port para aplicaciones basadas en el fwk.

Respecto de usar el fwk en aplicaciones ya funcionando, es exactamente el caso de lo que podríamos enfrentar al incluir RKH en ESP8266_RTOS_SDK. Dicho sea de paso, estuve analizando cómo crear tareas propias dentro de la arquitectura ESP8266_RTOS_SDK y en principio parece viable agregar el fwk para resolver la "lógica de más alto nivel" del dispositivo, haciendo uso de todas las bibliotecas y funcionalidades que provee ESP8266_RTOS_SDK

Por otra parte, tu análisis sugiere que no es necesaria la función rkh_startupTask(). ¿Entendí bien?

Si, en principio no es necesaria.

> rkh_fwk_enter() now starts the FreeRTOS' Scheluder.
> The RKH Timer Tick is generated through a FreeRTOS' Software Timer.
> Removed rkh_startupTask().
@cmancon cmancon requested a review from dariosb June 18, 2020 20:11
dariosb
dariosb previously approved these changes Jun 19, 2020
@@ -67,9 +67,12 @@ main(int argc, char *argv[])
RKH_SMA_ACTIVATE(CLI(cn), cli_qsto[cn], QSTO_SIZE, cli_stk[cn],
CLI_STK_SIZE);
}

#ifdef __FREERTOS_V10_03_00__
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahora se podrían eliminar las lineas 70-72 y 75. Quedando igual al original

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resuelto en 45c1128

&( xTimerBuffers[0] )
);

RKH_ASSERT(tick_TimerHandle);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Para que sea más entendible el código podes usar RKH_ENSURE() que verifica las post-condiciones

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perfecto! Lo incluyo en el próximo commit.

TaskHandle_t TaskHandle = NULL;
RKH_TRC_OPEN();

#if defined(RKH_USE_TRC_SENDER)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

¿Es correcto dejarlo con #if defined(RKH_USE_TRC_SENDER) o se podría mejorar?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fijate que está relacionado con

#if defined(RKH_USE_TRC_SENDER)

Si no está definido RKH_USE_TRC_SENDER no tiene utilidad publicar el simbolo y tampoco su existencia.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sí, pero es tal vez más robusto envolver con #if RKH_CFG_TRC_EN == RKH_ENABLED. ¿Valdrá la pena?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No hace falta. Para que RKH_USE_TRC_SENDER sea defined, TRC tiene que ser Enabled.

#if (((RKH_CFG_TRC_EN == 1) && (RKH_CFG_SMA_TRC_SNDR_EN == 1)) || \

@leanfrancucci
Copy link
Member Author

@cmancon tenés algo de estadística de shared ejecutándose al cabo de un tiempo pronunciado, tipo valores máximos o promedio de Stack Usage y Runtime?

@cmancon
Copy link
Collaborator

cmancon commented Jun 25, 2020

No recuerdo si tengo guardados los resultados pero he dejado funcionando el ejemplo unas 5 horas verificando los valores en las herramientas de Debug de FreeRTOS de MCUXpresso. Me parecían bastante saludables.

Lo que no recuerdo que tuviera era el watermark, pero si el uso de Stack por tarea y su respectivo Runtime

¿Te parece que hagamos un ensayo y registremos acá los resultados?

cmancon added 3 commits June 28, 2020 11:26
> Added "console output" via Semihosting to print info about the Demo.
> Added control of LEDs to show activity.
> Removed unused or unrelated code.
cmancon added 2 commits June 29, 2020 10:43
> Modified OpenOCD config to manipulate configuration from MCUXpresso.
> Added FreeRTOS helpers to improve integration with the built-in debugger and with OpenOCD.
> Separated into two Build configurations:
  - Debug: no semihosting.
  - Debug_with_Semihosting: Using Redlib(semihost).
> Created four Debug launchers:
  - Debug: No semihosting, No OpenOCD-FreeRTOS integration.
  - Debug Semihosting: Uses Debug_with_Semihosting build but No OpenOCD-FreeRTOS integration.
  - Debug OpenOCD+FreeRTOS: Uses Debug build but No OpenOCD-FreeRTOS integration.
  - Debug OpenOCD+FreeRTOS+Semihosting: Uses Debug_with_Semihosting build and OpenOCD-FreeRTOS integration.

  The OpenOCD-FreeRTOS integration enables tasks listed as threads by GDB. This allows to have fast and easy access to backtrace and current status of each task.

  The built-in debugger benefits with the helpers as it can access more data from the RTOS and show it on dedicated views. For example, depending on the memory scheme being used, it can show heap usage; or make a listing of timers, etc.
@leanfrancucci
Copy link
Member Author

@cmancon tenés info de ocupación de RAM y ROM de los archivos de la app shared y del fwk?. Tal vez tengas el IDE resume estos datos o sino pueden estar en el archivo que especifica el mapa de carga

@cmancon
Copy link
Collaborator

cmancon commented Jun 29, 2020

Bueno, habría que ver qué compilación tomar como parámetro.

Como para dar una idea, el siguiente es el uso de memoria del Shared usando semishoting con redlib(semihost) y teniendo el trace activado:

Memory region Used Size Region Size %age Used
MFlashA512: 43504 B 512 KB 8.30%
MFlashB512: 0 B 512 KB 0.00%
RamLoc32: 10200 B 32 KB 31.13%
RamLoc40: 40 KB 40 KB 100.00%
RamAHB32: 0 B 32 KB 0.00%
RamAHB16: 8 KB 16 KB 50.00%
RamAHB_ETB16: 0 B 16 KB 0.00%

Tanto RamLoc40 como RamAHB16 estan manejados por el MCUXpresso con el Managed Linker Script y allocan heap y stack respectivamente.

Como estamos usando el heap3 que envuelve el malloc() y el free() no puedo aproximar cuánto del heap dedicado es utilizado.

cmancon and others added 10 commits July 7, 2020 10:06
> Included a minimal debounce implementation to read imputs from GPIO.
> Include Pause function trigered by TEC1 in EDU-CIAA or DIN0 in CIAA.
> Included the "BOARD" Environment Variable. It is also used to conditionally compile the code to use the specific platform. Its values are compatible with sAPI definitions.
   Further explanation: In case that you use a EDU-CIAA-NXP, the OpenOCD config file depends on a environment variable to know it. If it is not defined, it will fallback to CIAA-NXP. To give a seamless experience, this variable is included in the project and, additionally, it's used to adapt the GPIO pins hardware configuration.

> All Build Configurations were checked and the "Release" configuration was corrected to work properly.
> Created debug configurations (and launchers) for each platform.
> Simplified options to use OpenOCD FreeRTOS integration and semihosting in any case.
> Left a "legacy" configuration as a temporary backup.
> Head pointing to tag V10.3.0-kernel-only.
@leanfrancucci
Copy link
Member Author

Are there pending tasks related to this port?. It would be great to turn over a new leaf, and then to think about fresh application examples with freeRTOS and RKH, as we have talked about several weeks ago 💪 💪

@cmancon
Copy link
Collaborator

cmancon commented Aug 19, 2020

We are back to English? hehe
Possible tasks to finish:

  1. Merge fix freertos submodule link #14
  2. Compose some sort of memory usage report.
  3. Compose a README.

What do you think?

> Before implementing the tact switch (or digital inputs depending the specific platform) bsp_timeTick() was only used by the trace output. For that reason, the implementation was inside a conditional compilation block.
   When the previously said functionality was implemented, the corresponding section of the bsp_timeTick() function was modified to be conditionally compiled but  it wasn't noticed the the entire function was inside a conditional block itself.
   This situation is corrected here and will correctly compile if the trace functionality is disabled.
@codecov-commenter
Copy link

Codecov Report

Merging #13 into develop will increase coverage by 0.03%.
The diff coverage is n/a.

Impacted file tree graph

@@             Coverage Diff             @@
##           develop      #13      +/-   ##
===========================================
+ Coverage    95.65%   95.68%   +0.03%     
===========================================
  Files           13       13              
  Lines          598      603       +5     
===========================================
+ Hits           572      577       +5     
  Misses          26       26              
Impacted Files Coverage Δ
source/tmr/src/rkhtmr.c 100.00% <0.00%> (ø)
source/fwk/src/rkhfwk_evtpool.c 100.00% <0.00%> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 16b319c...4af13ed. Read the comment docs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants