Sergey1212
Пункты: 794
Регистрация: 19.03.2013
Подскажите как посмотреть/измерить текущее реальное значение тактовой частоты?
Пробовал инкременты подсчитывать получилось ~5340000 i++ за секунду в примере getting-started-project-at91sam9m10-ekes-at91sam9m10-sram.
В майне все закоментил оставив вызов ConfigureTc и следом цикл с инкрементом.
В ConfigureTc поправил с 4 Гц на 1 Гц
В TC0_IrqHandler сделал принтф i и следом i=0.
Отсюда возникло еще несколько вопросов
Вывод того i в терминале колебался от 5300000 до 5400000 , а иногда вместо ожидаемого значения в 5,3 млн. получалось 10,6 млн. будто i=0 не выполнилось или частота вдруг увеличилась в 2 раза.
Разве не должно получаться одно и тоже число +-1?
Где можно посмотреть сколько тактов занимает i++, вывод бита на порт GPIO и др. у данного проца?
Поправил цифирки на 0 ошибся
Jury093
Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата Где можно посмотреть сколько тактов занимает i++, вывод бита на порт GPIO и др. у данного проца?
в доке на АРМ смотрите наименование архитектуры, потом гуглите описание команд этой архитектуры..
http://en.wikipedia.org/wiki/ARM9
в конце страницы..
На любой вопрос есть любой ответ.
Sergey1212
Пункты: 794
Регистрация: 19.03.2013
Что то не получается найти ничего подобного.
Почему i=0 не всегда выполняется?
Вот код:
Код
void TC0_IrqHandler(void)
{
volatile unsigned int dummy;
// Clear status bit to acknowledge interrupt
dummy = AT91C_BASE_TC0->TC_SR;
printf(" %d ", i);
i=0;
}
void ConfigureTc(void)
{
unsigned int div;
unsigned int tcclks;
// Enable peripheral clock
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC0;
// Configure TC for a 4Hz frequency and trigger on RC compare
TC_FindMckDivisor(1, BOARD_MCK, &div, &tcclks);
TC_Configure(AT91C_BASE_TC0, tcclks | AT91C_TC_CPCTRG);
AT91C_BASE_TC0->TC_RC = (BOARD_MCK / div) / 1; // timerFreq / desiredFreq
// Configure and enable interrupt on RC compare
IRQ_ConfigureIT(AT91C_ID_TC0, 0, TC0_IrqHandler);
AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS;
IRQ_EnableIT(AT91C_ID_TC0);
// Start the counter if LED is enabled.
if (pLedStates[1]) {
TC_Start(AT91C_BASE_TC0);
}
}
int main(void)
{
// DBGU output configuration
TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
printf("-- Getting Started Project %s --\n\r", SOFTPACK_VERSION);
printf("-- %s\n\r", BOARD_NAME);
printf("-- Compiled: %s %s --\n\r", __DATE__, __TIME__);
ConfigureTc();
// Main loop
while (1) {
i++;
}
}
А вот результат:
Код
-- Getting Started Project 1.9-rc1 --
-- AT91SAM9M10-EKES
-- Compiled: Apr 18 2013 09:16:13 --
-I- configure pit.
5619031 11161938 16704328 5542368 5542906 11085840 16628208 5542395 5542933 11085846 5542403 5542941 5542920 11085851 16628233 5542392 5542947 5542909 5542936 5542898 5542925 5542935 5542914 5542933 5542895 5542922
И при таком результате если предположить что инкремент занимает даже 6 тактов то получается ~33Мгц
Sergey1212
Пункты: 794
Регистрация: 19.03.2013
Заменил i=0 на
while (i > 0)
{
i=0;
}
Получилось вот что
Код -- Getting Started Project 1.9-rc1 --
-- AT91SAM9M10-EKES
-- Compiled: Apr 18 2013 09:35:14 --
5407473 10736803 16065643 21394453 26723280 32052124 5328814 5329338 5329354 5329371 5329341 5329357 10658686 5328838 5329361 5329332 5329349 5329365 5329335 5329352 5329369 5329339 10658695
Я так понимаю надо ее как-то синхронизировать ну это ладно
А почему число разное получаются и так мало?
Sergey1212
Пункты: 794
Регистрация: 19.03.2013
Инициализация там никакая в этих примерах(