Skip to content

Commit

Permalink
ЛР14,16. Увеличение разрядности таймера
Browse files Browse the repository at this point in the history
  • Loading branch information
HepoH3 committed May 23, 2024
1 parent bf86517 commit f7ab67d
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 11 deletions.
8 changes: 5 additions & 3 deletions Labs/14. Programming/platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,13 @@ struct VGA_HANDLE vga = {CAST(uint8_t *const, 0x07000000), CAST(uint8_t *const,

struct TIMER_HANDLE
{
volatile const uint32_t system_counter;
volatile uint32_t delay;
volatile const uint32_t system_counter_low_bits;
volatile const uint32_t system_counter_high_bits;
volatile uint32_t delay_low_bits;
volatile uint32_t delay_high_bits;
volatile uint32_t mode;
volatile uint32_t repeat_counter;
volatile const uint32_t __unused2__[5];
volatile const uint32_t __unused2__[3];
volatile uint32_t rst;
};
struct TIMER_HANDLE *const timer_ptr = CAST(struct TIMER_HANDLE *const, 0x08000000);
Expand Down
18 changes: 10 additions & 8 deletions Labs/16. Coremark/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,21 +41,23 @@

### Таймер

Разберемся с тем, как будет работать наш таймер. По сути, это просто системный счетчик (не путайте с программным счетчиком), непрерывно считающий такты с момента последнего сброса. Системным он называется потому, что работает на системной тактовой частоте. Для измерения времени мы будем засекать значение счетчика на момент начала отсчета и значение счетчика в конце отсчета. Зная тактовую частоту и разность между значениями счетчика мы с легкостью сможем вычислить прошедшее время. При этом нужно обеспечить счетчик такой разрядностью, чтобы он точно не смог переполниться.
Разберемся с тем, как будет работать наш таймер. По сути, это просто системный счетчик (не путайте с программным счетчиком), непрерывно считающий такты с момента последнего сброса. Системным он называется потому, что работает на системной тактовой частоте. Значения частот, на которых работают процессорные системы сравнимы с 32-битными значениями, поэтому системный счетчик должен быть 64-битным. Для измерения времени мы будем засекать значение счетчика на момент начала отсчета и значение счетчика в конце отсчета. Зная тактовую частоту и разность между значениями счетчика мы с легкостью сможем вычислить прошедшее время. При этом нужно обеспечить счетчик такой разрядностью, чтобы он точно не смог переполниться.

Поскольку мы уже назвали данный модуль "таймером", чтобы тот не был слишком простым, давайте добавим ему функциональности: пускай это будет устройство, способное генерировать прерывание через заданное число тактов. Таким образом, процессорная система сможет засекать время без постоянного опроса счетчика.

Было бы удобно, чтобы мы могли управлять тем, каким образом данный модуль будет генерировать такое прерывание: однократно, заданное число раз, или же бесконечно, пока тот не остановят.

Таким образом, мы сформировали следующее адресное пространство данного контроллера:

|Адрес|Режим доступа|Допустимые значения| Функциональное назначение |
|-----|-------------|-------------------|---------------------------------------------------------------------------------|
|0x00 | R | [0:2⁶⁴-1] | Значение системного счетчика, доступное только для чтения |
|0x04 | RW | [0:2⁶⁴-1] | Указание задержки, спустя которую таймер будет генерировать прерывание |
|0x08 | RW | [0:2] | Указание режима генерации прерываний (выключен, заданное число раз, бесконечно) |
|0x0c | RW | [0:2³²-1] | Указание количества повторений генерации прерываний |
|0x24 | W | 1 | Программный сброс |
|Адрес|Режим доступа|Допустимые значения| Функциональное назначение |
|-----|-------------|-------------------|---------------------------------------------------------------------------------------|
|0x00 | R | [0:2³²-1] | Значение младших 32 бит системного счетчика, доступное только для чтения |
|0x00 | R | [0:2³²-1] | Значение старших 32 бит системного счетчика, доступное только для чтения |
|0x08 | RW | [0:2³²-1] | Указание младших 32 бит задержки, спустя которую таймер будет генерировать прерывание |
|0x08 | RW | [0:2³²-1] | Указание старших 32 бит задержки, спустя которую таймер будет генерировать прерывание |
|0x10 | RW | [0:2] | Указание режима генерации прерываний (выключен, заданное число раз, бесконечно) |
|0x14 | RW | [0:2³²-1] | Указание количества повторений генерации прерываний |
|0x24 | W | 1 | Программный сброс |

Прототип модуля следующий:

Expand Down

0 comments on commit f7ab67d

Please sign in to comment.