RKH icon indicating copy to clipboard operation
RKH copied to clipboard

Create freertos port

Open leanfrancucci opened this issue 4 years ago • 11 comments

leanfrancucci avatar Jun 10 '20 19:06 leanfrancucci

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 */
}

leanfrancucci avatar Jun 16 '20 12:06 leanfrancucci

@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 avatar Jun 16 '20 14:06 cmancon

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

cmancon avatar Jun 16 '20 14:06 cmancon

@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.

leanfrancucci avatar Jun 16 '20 18:06 leanfrancucci

@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?

leanfrancucci avatar Jun 25 '20 20:06 leanfrancucci

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 avatar Jun 25 '20 21:06 cmancon

@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

leanfrancucci avatar Jun 29 '20 17:06 leanfrancucci

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 avatar Jun 29 '20 22:06 cmancon

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 :muscle: :muscle:

leanfrancucci avatar Aug 19 '20 03:08 leanfrancucci

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

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

What do you think?

cmancon avatar Aug 19 '20 12:08 cmancon

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.

codecov-commenter avatar Sep 20 '20 22:09 codecov-commenter