Запнулся на проблеме. Нид хэлп, как говорится )
Задача.
Есть ядро программы в виде отдельного модуля. Назвал его Kernel
К проекту подключаются другие сишные модули. Они автоматически регистрируются в ядре.
У каждого модуля есть такая запись:
Код: Выделить всё
#define _NoPSR 0
static const uint16_t* PSR_Addresses[]
{
//InitPSR
_NoPSR,
//TurnOnPSR
_NoPSR,
//TurnOffPSR
_NoPSR,
//ReportPRS
(uint16_t*) &ExceptionsReport,
//ProcessPRS
(uint16_t*) &Exceptions,
//Input 1 - Очистка таблицы исключений
(uint16_t*) &RemoveExceptions
};
Далее, при инициализации каждого модуля, последний заносит в общую таблицу ядра некую информацию о себе, в том числе он должен передать указатель на эту таблицу. Вроде такого:
Код: Выделить всё
#define Sub (uint16_t*) &
void Exceptions_KernelInit(void)
{
Kernel_RegisterProcess(Sub InsExceptions, PSR_Addresses, _DT_Exception);
}
Код: Выделить всё
struct
{
enum _dtList EDType;
uint16_t (*pFunc);
uint16_t PSRtable; //тут пока глюки
} knAddr[ProcessesCount];
void Kernel_RegisterProcess(uint16_t (*ProcessVector), const uint16_t *PSRtable, enum _dtList EDType)
{
knAddr[++knProperties.CurrentID].EDType = EDType;
knAddr[knProperties.CurrentID].pFunc = &(*ProcessVector);
knAddr[knProperties.CurrentID].PSRtable = (uint16_t) &(*PSRtable); //глюки-глюки. сюда пока особо не смотреть. игрался, ничего не выходит пока
}
//И дальше должен идти сам вызов удаленной функции:
char Kernel_CallPSR(char DeviceID, char _kp_position)
{
if ((uint16_t) knAddr[DeviceID].PSRtable[_kp_position] == _NoPSR)
return 0;
else
return ((char(*)(void)) ...что-то тут... (knAddr[DeviceID].PSRtable)[_kp_position]();
}
По-русски хоть написал? ))


