Greffe uC-OS2 V2.93 STM32L476 : Démarrage du système

avant-propos

  • Les deux premiers articles ont construit NUCLEO-L476RGle projet bare-metal STM32L476RG via STM32CubeMX, téléchargé le code source de uC-OS2 V2.93 et ​​ajouté le fichier source de uC-OS2 au projet Keil MDK5

  • Cet article adapte la minuterie système d'uC-OS2 (Systick) et PendSV_Handlercrée des tâches utilisateur pour faire démarrer et exécuter uC-OS2

environnement de développement

  • win10 64 bits

  • Keil uVision5, MDK V5.36

  • uC-OS2 V2.93

  • Carte de développement : NUCLEO-L476RG, MCU est STM32L476RG

  • STM32CubeMX 6.9.1, utilisé pour générer des projets bare metal pour STM32

Créer des tâches utilisateur

  • Créez une tâche clignotante ici et implémentez-la dans main.c
#include "main.h"
#include "led.h"
#include "app_cfg.h"
#include "os.h"

UART_HandleTypeDef huart2;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);

#define TASK_LED_PRIO               5
#define TASK_LED_STACK_SIZE         128
static OS_STK task_led_stack[TASK_LED_STACK_SIZE];

static void task_led_entry(void *p_arg)
{
    
    
    while (1)
    {
    
    
        led_grn_ctrl(1);
        OSTimeDly(1000);
        led_grn_ctrl(0);
        OSTimeDly(1000);
    }
}

void led_task_init(void)
{
    
    
    OSTaskCreate(task_led_entry,(void *)0, &task_led_stack[TASK_LED_STACK_SIZE-1], TASK_LED_PRIO);
}

HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
    
    
    return HAL_OK;
}

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
    
    
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART2_UART_Init();
    OSInit();
    led_task_init();
    OS_CPU_SysTickInitFreq(80000000);
    OSStart();

    return 0;
}

Adapter Systick

  • Après compilation et téléchargement du projet, il s'est avéré que la tâche n'était pas planifiée normalement car elle n'était pas adaptée à uC-OS2

  • Tout d'abord, vous devez activer la minuterie système de uC-OS2, qui est le rythme cardiaque du système.

  • uC-OS2 V2.93 a la fonction d'initialisation Systick, uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\os_cpu_c.c,OS_CPU_SysTickInitFreq

  • Remarques : La bibliothèque HAL de STM32, par défaut, initialise le Systick une fois en 1 ms HAL_InitviaHAL_InitTick

  • Ici, premièrement, la bibliothèque STM32 HAL est réécrite HAL_InitTick. La valeur par défaut est une fonction faible, qui peut être réécrite. Ici, la réécriture est vide, c'est-à-dire que le Systick n'est pas initialisé via la bibliothèque STM32 HAL.

HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
    
    
    return HAL_OK;
}
  • OS_CPU_SysTickInitFreq(80000000);Initialiser Systick via

  • Après avoir initialisé le Systick, il faut traiter la fonction d'interruption du Systick : SysTick_Handler, il faut appeler uC-OS2 OS_CPU_SysTickHandler, modifier le fichierstm32l476_ucosii_led\Core\Src\stm32l4xx_it.c

#include "app_cfg.h"
#include "os_cpu.h"

void SysTick_Handler(void)
{
    
    
    OS_CPU_SysTickHandler();
    HAL_IncTick();
}
  • Avec la modification ci-dessus, le Systick est initialisé et l'interruption Systick peut être déclenchée périodiquement

  • S'il s'avère que le Systick ne déclenche pas d'interruption à 1 milliseconde, si le retard est de 1 seconde et que le temps est de 10 secondes, il doit être modifié, modifié et changé, c'est-à-dire que l' uC-OS2\Cfg\Template\os_cfg.hinterruption OS_TICKS_PER_SECSystick #define OS_TICKS_PER_SEC 1000uest déclenché une fois à 1 milliseconde

adaptationPendSV_Handler

  • Les puces comme la série STM32 PendSV_Handlerchangent de tâche par défaut via des interruptions, modifient le fichier stm32l476_ucosii_led\Core\Src\stm32l4xx_it.cdansPendSV_Handler
void PendSV_Handler(void)
{
    
    
    OS_CPU_PendSVHandler();
}
  • Notez que stm32l476_ucosii_led\Core\Src\stm32l4xx_it.cles fichiers d'en-tête sont inclus dans
#include "app_cfg.h"
#include "os_cpu.h"

Compiler et graver

  • Après compilation et programmation, il a été constaté que la LED de la carte de développement scintillait normalement, la transplantation du système uC-OS2 était initialement terminée et la commutation de tâche et le retard du système fonctionnaient normalement.

  • Vous pouvez cliquer sur le bouton [Debug] de Keil MDK5 pour entrer en mode Debug, ajouter un [Breakpoint], exécuter en une seule étape ou en continu, et observer la planification des tâches uC-OS2, la commutation, l'exécution de la routine utilisateur, etc.

Instructions de débogage

  • Si le débogage constate que [Breakpoint] ne fonctionne pas, vous devez ajuster le niveau d'optimisation de la compilation de Keil MDK5, essayez de le changer en O0

insérez la description de l'image ici

insérez la description de l'image ici

  • Grâce au débogage logiciel, vous pouvez vous familiariser avec le processus d'initialisation, de démarrage et de fonctionnement de l'ensemble du système

résumé

  • PendSVCet article réalise le démarrage et le fonctionnement normaux de uC-OS2 en adaptant deux adaptations clés de uC-OS2 : la minuterie système et l'exception système.

  • uC-OS2 est relativement facile à transplanter, et nous continuerons à étudier uC-OS2 plus tard, comme l'ajout d'une sortie de port série, la transplantation de Shell, etc.

おすすめ

転載: blog.csdn.net/tcjy1000/article/details/132073176