Переопределить указатель на функцию - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть код ниже, где мне нужно переназначить (переопределить) C_FLASH_FUNCTION_ADDRESS.

int main(void) {
    // your code goes here

    execute_this();

    pPointerToFunc = (void *)*(uint32_t *)C_FLASH_FUNCTION_ADDRESS;

    pPointerToFunc();

    return 0;
}

Причина, по которой мне нужно переопределить C_FLASH_FUNCTION_ADDRESS, заключается в том, что C_FLASH_FUNCTION_ADDRESS - это некое место во флэш-памяти, где хранится адрес какой-либо другой функции. Поскольку у меня нет FLASH, я хочу переопределить C_FLASH_FUNCTION_ADDRESS по некоторому адресу в оперативной памяти. По любой причине мне не нужно было менять строку: pPointerToFunc = (void *)*(uint32_t *)C_FLASH_FUNCTION_ADDRESS;

Я попробовал приведенный ниже код для этого, он компилируется, однако возникает ошибка во время выполнения.

#include <stdio.h>

void Testing_pOP_Start(void)
{
    printf("Inside");
    return;
}

typedef unsigned int uint32_t;

#define C_FLASH_FUNCTION_ADDRESS (ptemp)

void (*pPointerToFunc)(void);

unsigned long ptemp;

void execute_this(void)
{
    ptemp = (unsigned long)(&Testing_pOP_Start);
}


int main(void) {
    // your code goes here

    execute_this();

    pPointerToFunc = (void *)*(uint32_t *)C_FLASH_FUNCTION_ADDRESS;

    pPointerToFunc();

    return 0;
}

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

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

От части вашего ответа на мой комментарий:

"Я должен быть в состоянии вызвать Testing_pOP_Start (), используя pPointerToFunc"

Полагаю, вы пытаетесь достичь этого:

#include <stdio.h>

void Testing_pOP_Start(void)
{
    printf("Inside");
    return;
}

typedef void (*C_FLASH_FUNCTION_ADDRESS)(void);
C_FLASH_FUNCTION_ADDRESS pPointerToFunc= &Testing_pOP_Start;

int main(void)
{
     // your code goes here

    pPointerToFunc();

    return 0;
}

Попробуйте этот код и дайте мне знать, чтобы я мог добавить больше деталей или иным образом.

0 голосов
/ 07 ноября 2018

Вы должны научиться пользоваться отладчиком.

Я просто запустил ваш код в отладчике, и ошибка сразу стала очевидной: после вызова execute_this значения ptemp и pPointerToFunc были другими.

Затем я понял, что C_FLASH_FUNCTION_ADDRESS - это не адрес функции, а адрес указателя на функцию (еще один уровень косвенности).

Исправление было тогда очевидным:

#define C_FLASH_FUNCTION_ADDRESS (&ptemp)

Вот и все ...


Я использую онлайн-компилятор не является веской причиной, чтобы не учиться использовать отладчик. Вы можете найти бесплатные компиляторы, и отладчик является важным инструментом.

0 голосов
/ 07 ноября 2018

C_FLASH_FUNCTION_ADDRESS - это определенное место во флэш-памяти

Так что C_FLASH_FUNCTION_ADDRESS - это адрес во флэш-памяти.

Но #define C_FLASH_FUNCTION_ADDRESS (ptemp) читает значение , сохраненное в ptemp.

Вам нужно одно из этих двух изменений. Получите адрес из ptemp (но он был приведен к другому типу, uint32_t вместо unsigned long, тип должен быть таким же и достаточным для хранения адреса, используйте intptr_t).

#define C_FLASH_FUNCTION_ADDRESS (&ptemp)
...
pPointerToFunc = (void *)*C_FLASH_FUNCTION_ADDRESS;

или прочитайте и приведите само значение

#define C_FLASH_FUNCTION_ADDRESS (ptemp)
...
pPointerToFunc = (void *)C_FLASH_FUNCTION_ADDRESS;

Обновление:

Что бы я ни делал, я не должен менять эту строку - pPointerToFunc = (void *)*(uint32_t *)C_FLASH_FUNCTION_ADDRESS; Может ли это быть возможно?

Используйте первый подход, но ptemp должен быть uint32_t - того же типа, что и приведение в (фиксированной) строке.

#define C_FLASH_FUNCTION_ADDRESS (&ptemp)
...
uint32_t long ptemp;
...
pPointerToFunc = (void *)*(uint32_t *)C_FLASH_FUNCTION_ADDRESS;

Обеспечение 32-битных указателей (используйте 32-битную среду программирования, для 64-битных ОС и gcc можно использовать -m32, если установлена ​​32-битная поддержка).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...