/** * \file AsyncRunner.cpp * \project EFC_PlatformC28x_Test * * Created on: 20 мая 2024 г. * Author: leonid */ #include "AsyncRunner.hh" #include #include #include void (*cputimer1_pfinthandler)(); bool cputimer1_first_run; __interrupt void cputimer1_interrupt() { if( cputimer1_first_run ) cputimer1_pfinthandler(); CPUTimer_stopTimer(CPUTIMER1_BASE); cputimer1_first_run = false; } void cputimer1_init( void (*interrupt_handler)() ) { cputimer1_pfinthandler = interrupt_handler; Interrupt_register( INT_TIMER1, &cputimer1_interrupt ); Interrupt_enable(INT_TIMER1); SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER1); CPUTimer_stopTimer(CPUTIMER1_BASE); CPUTimer_setPreScaler(CPUTIMER1_BASE, CPUTIMER_CLOCK_PRESCALER_1); CPUTimer_enableInterrupt(CPUTIMER1_BASE); } //Запуск таймера void cputimer1_run( uint32_t processor_tick ) { CPUTimer_setPeriod( CPUTIMER1_BASE, processor_tick + 1 ); CPUTimer_reloadTimerCounter(CPUTIMER1_BASE); CPUTimer_clearOverflowFlag( CPUTIMER1_BASE ); cputimer1_first_run = true; CPUTimer_startTimer(CPUTIMER1_BASE); //Задержка для гарантии входа в прерывание, исключения непокрытого // кода после выполнения функции из-за отзывчивости прерываний. for( volatile int i = 0; i < 4; i++ ); } void cputimer1_stop() { CPUTimer_stopTimer(CPUTIMER1_BASE); } void platform::AsyncRunner::async_run() { platform::AsyncRunner::getInstance().run(); } platform::AsyncRunner::AsyncRunner() : task(0), ran(false) { cputimer1_init( &async_run ); } void platform::AsyncRunner::run_after( umlib::tests::TaskInterface * new_task, uint32_t processor_tick ) { task = new_task; ran = false; cputimer1_run(processor_tick); } void platform::AsyncRunner::cancel() { cputimer1_stop(); } bool platform::AsyncRunner::is_ran() { return ran; } void platform::AsyncRunner::run() { if( task ) { task->do_task(); ran = true; } } platform::AsyncRunner & platform::AsyncRunner::getInstance() { static AsyncRunner instance; return instance; }