Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top