измерил время выполнения задачи - PullRequest
0 голосов
/ 17 июня 2020

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...