Это можно понять следующим образом:
cyisraddress
— это указатель на функцию (указатель на функцию). Здесь она имеет вид функции, не принимающей аргументов (void)
и ничего не возвращающей (void)
. Поскольку это на ARM Cortex-M3, указатель должен быть 4-байтовым значением, например. 0x20010004. Это 4-байтовое значение является расположением функции в памяти, т. е. адресом ее первой инструкции. Здесь oldIsr
и address
указывают на существующую и новую ISR (процедуру обслуживания прерываний) соответственно.
В этой строке указано, что #define CY_INT_VECT_TABLE ((cyisraddress **) 0xe000ed08u)
, 0xe000ed08u
имеют тип cyisraddress **
, что означает указатель на указатель на указатель на функцию. Обратите внимание, что 0xe000ed08u
— это адрес регистра VTOR (регистр смещения векторной таблицы), в котором хранится смещение базового адреса векторной таблицы от адреса памяти 0x00000000 (ссылка)
Когда они используют *CY_INT_VECT_TABLE
, это означает значение, хранящееся по адресу 0xe000ed08, который фактически является адресом векторной таблицы. Это значение имеет тип указатель на указатель функции.
Теперь самое интересное. Для cyisraddress *ramVectorTable
типом ramVectorTable
является указатель на указатель функции. При дальнейшем чтении кода вы заметите, что они используют ramVectorTable
в качестве массива, что похоже на эту более простую версию:
int a[10];
Затем вы можете использовать a[i]
(a
как массив целых чисел) или *(a+i)
(a
как указатель на целое число) для доступа к элементам массива.
Следовательно, ramVectorTable
можно использовать как массив указателей на функции, таким образом, ramVectorTable[number & CY_INT_SYS_NUMBER_MASK]
— это просто *(ramVectorTable + number & CY_INT_SYS_NUMBER_MASK)
, это значение имеет тип cyisraddress
(указатель на функцию).
Наконец, векторную таблицу можно рассматривать как массив указателей на функции, поэтому ramVectorTable
— это просто массив указателей на ISR.
person
DinhQC
schedule
12.06.2019