avant-propos
-
Les deux premiers articles ont construit
NUCLEO-L476RG
le 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_Handler
cré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_Init
viaHAL_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-OS2OS_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.h
interruptionOS_TICKS_PER_SEC
Systick#define OS_TICKS_PER_SEC 1000u
est déclenché une fois à 1 milliseconde
adaptationPendSV_Handler
- Les puces comme la série STM32
PendSV_Handler
changent de tâche par défaut via des interruptions, modifient le fichierstm32l476_ucosii_led\Core\Src\stm32l4xx_it.c
dansPendSV_Handler
void PendSV_Handler(void)
{
OS_CPU_PendSVHandler();
}
- Notez que
stm32l476_ucosii_led\Core\Src\stm32l4xx_it.c
les 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
- 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é
-
PendSV
Cet 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.