Портирование freertos на SOC этого m0, частота tc0 не может быть больше 1000
Я новичок по поводу freertos и портирования freertos на один SOC(rn8215: кора m0 + adc + uart + lcd+ мера энергии). Этот SOC использовался в нашем продукте много лет.
И я знаю, что freertos можно портировать на кору m0(stm32f0xx). Должно быть хорошо работать на этом чипе SOC.
В соответствии с предложением портирования freertos, я создал проект и добавил в него связанные файлы. Было создано четыре задачи для тестирования основных функций.
task prior
vtask_100ms 1
key_scan_tas 2
vsecond_task 3
vuart_rx_task 5
соответствующие настройки / ресурсы перечислены ниже.
configTICK_RATE_HZ = 1000. (отметка 1 мс)
Включить таймер tc0 h/w,(1 мс, и isr-handler не делают ничего, кроме очистки бита состояния)
Включить прерывание по Rtc (1сек)
До сих пор эти функции могут работать хорошо (Uart может выполнять действие tx/rx; контекст Lcd может отображаться в порядке прокрутки;Power_led может быть флэш-памятью; система может работать в течение примерно 10 часов стабильно).
когда я изменяю частоту TC0 на 2000(или больше)(на самом деле, я хочу, чтобы он работал на частоте 7200 Гц для дискретизации АЦП). После включения через несколько минут (2 минуты или 5 минут, время не фиксировано), система будет остановлена (ОС может ввести tc0 isr-handler/rtc-handler. Но индикатор питания не может быть прошит; rart-tx от uart не может работать; контекст Lcd не может быть прокручен.Похоже, что расписание задачи было остановлено).
- Я уверен, что этот SOC tc0 работает нормально (В до проекта, он работает на частоте 7200 Гц для дискретизации АЦП, без OS-системы).
- В этом проекте freertos, если я уберу tc0 interrupt-init и isr-handler или я изменю частоту tc0 на небольшое значение (<=1000), проблема остановки не возникнет.
Я проверил значение NVIC следующим образом. Данные захвата NVIC
Код инициализации TC0 и код обработчика isr следующие.
TC0->CCFG = 0;
TC0->PS = rn8211_get_sys_freq() / 2000 - 1;
TC0->DN = 0;
TC0->CTRL = 0x03;
TC0->IE = 0x01;
NVIC_SetPriority (TC0_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
NVIC_EnableIRQ(TC0_IRQn);
//isr-handler
void TC0_HANDLER(void)
{
TC0->STA = 0x0f;
}
Какую часть / место я должен проверить об этой проблеме?