1- Как здесь измеряется время выполнения задачи?
2- Как можно быть уверенным, что мы не пере- / занижаем счет из-за прерываний?
3- И как уверены ли мы, что нет переполнений?
its msp432p401r.h Попытка измерить, сколько времени требуется для выполнения задачи periodi c, используя TimerA 1. Задача печатает собственное время выполнения с помощью Booster Pack, настройка более сложного программного обеспечения, использование библиотечных функций, взаимодействие с другим периферийным устройством (ЖК-экран), использование FATE-OSv1.1 и выполнение анализа производительности программного обеспечения.
#include <msp.h>
//Must always include our OS header file
#include "fate.h"
#include "bsp.h"
#define ST7735_GREEN 0x07E0
//Functions that implement our 2 periodic tasks
//Return type and arguments must always be void
//For now, no local variables
//No calling other functions
//When execution is finished, must always call "Task_stop" with its name
//NOT return: that would probably crash our kernel
void helper(void);
int interruptCounter;
int change_Display(void)
{
BSP_LCD_SetCursor((uint32_t)0, (uint32_t)0);
BSP_LCD_OutUDec((uint32_t)TA1R, ST7735_GREEN);
TA1CTL &= (uint16_t)~(BIT5 | BIT4); //stop timer
return interruptCounter * 65536 - 30551 * interruptCounter + TA1R; //return count
}
void helper(void)
{
interruptCounter = 0;
TA1R = (uint16_t)0;
TA1CTL |= (uint16_t)BIT5; //Continuous MODE
int count = change_Display();
BSP_LCD_SetCursor((uint32_t)0, (uint32_t)6);
BSP_LCD_OutUDec((uint32_t)count, ST7735_GREEN); //display real count + avg time of Task_stop
BSP_LCD_FillScreen(0);
Task_stop((uint32_t)helper); //must restart clock to determine time to Task_stop
}
void TA1_0_IRQHandler()
{ //used to count how many times the timer overflows
TA1CCTL0 &= (uint16_t) ~(1<<0); //clear CCIFG
interruptCounter++;
}
int main()
{
WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD; //stop watchdog timer
BSP_LCD_Init();
Task_list_init();
Task_add((uint32_t)helper,(uint32_t) 200, (uint32_t) 1); //2 second period
//configure timer
TA1CTL &= (uint16_t)~(BIT5 | BIT4); //stop timer
TA1CTL |= (uint16_t)(BIT8); //ACLK
TA1CCTL0 &= (uint16_t) ~(1<<0); //clear CCIFG
TA1CCTL0 |= (uint16_t) (1<<4); //interrupt enable for when reaches 0
TA1CTL |= (uint16_t)(BIT1); //enable interrupts
NVIC_SetPriority(TA1_0_IRQn, 2);
NVIC_ClearPendingIRQ(TA1_0_IRQn);
NVIC_EnableIRQ(TA1_0_IRQn);
__ASM("CPSIE I");
Task_schedule(); //This will begin scheduling our tasks
return 0;
}