Адрес 0 перезаписывается нулевым указателем на HCS08 - PullRequest
2 голосов
/ 04 августа 2010

На моем 8-битном микросхеме Freescale HCS08 всякий раз, когда я вызываю библиотечную функцию, которая возвращает значения указателям, я передаю ее, и я на самом деле не хочу их, я добавляю NULL, например,

UART_SendBlock((char *)txstr, strlen(txstr), NULL);

Тип последнего аргумента - uint16_t * и возвращает количество фактически отправленных символов, значение, которое меня не волнует.

Однако у меня были проблемы с портом A на моем микро-шланге, который каждый раз вызывался при вызове этой функции, и отладка указывала мне на этот аргумент.Регистры конфигурации порта A находятся по адресам 0x0000 и 0x0001, где NULL (он же (void *)0) указывает.Я думал, что NULL было каким-то волшебством, когда он на самом деле ничего не делал, но это не так.

Мой обходной путь кажется действительно взломанным:

#define MNUL (void *)(&mynull)
uint32_t mynull;

Есть ли лучшерешение?Я попытался определить MNUL для неиспользуемого сегмента памяти на моем процессоре, но это вызывает немедленный сброс.

Ответы [ 2 ]

9 голосов
/ 04 августа 2010

Если в документации для UART_SendBlock не указано, что передача ему нулевого указателя в порядке, вы, вероятно, получите неопределенное поведение - и в этом случае кажется, что функция просто записывает адрес, который вы передали, адрес 0 - чтопод "неопределенным поведением".

Просто вызовите его с параметром, нет причин быть «умным» в этом отношении.

uint16_t unused_16;
UART_SendBlock((char *)txstr, strlen(txstr), &unused_16);

Если у вас ограниченные ресурсы, сделайте unused_16 глобальным и используйте его в другихместа

3 голосов
/ 04 августа 2010

Функция пытается записать значение туда, куда указывает последний аргумент.Вы передаете NULL (0x0000), поэтому результат записывается в ячейку памяти 0x0000 или в порт A. Обычно (в общем программировании) функция проверяет аргумент и не пытается записать в местоположение, еслиNULL, но, похоже, эта функция не соответствует этому соглашению.Вам нужно выделить переменную для функции, в которую будет записан ее результат, даже если вы не собираетесь ее использовать.

...