g ++ оптимизация строчных букв в верхний регистр - ошибка? - PullRequest
1 голос
/ 12 июля 2011

Я сталкиваюсь с очень странной проблемой при использовании g ++ 4.1.2. У меня есть очень простая программа, которая открывает последовательный порт и записывает в него данные. Порт открывается и настраивается с помощью следующих команд:

fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);

struct termios port_settings;

cfsetispeed(&port_settings, B115200);
cfsetospeed(&port_settings, B115200);

port_settings.c_cflag &= ~PARENB;
port_settings.c_cflag &= ~CSTOPB;
port_settings.c_cflag &= ~CSIZE;
port_settings.c_cflag |= CS8;

tcsetattr(fd, TCSANOW, &port_settings);

У меня есть массив char, состоящий из констант ASCII для отправки по последовательному каналу. Данные записываются с использованием простых write(fd, &serial_out, 1), serial_out - символов, которые должны быть записаны. Затем эти данные помещаются на ЖК-дисплей 16x2.

Теперь вот странная вещь. Пока я компилирую с -O0, все это прекрасно работает. Однако, если я скомпилирую что-либо более высокое (1, 2, 3 или с), все строчные буквы отображаются на ЖК-дисплее заглавными буквами.

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

Ответы [ 2 ]

3 голосов
/ 12 июля 2011

Это потому, что вы в основном устанавливаете параметры терминала на случайные значения.

Чтобы получить более осмысленное поведение, сначала опросите настройки последовательного порта, а затем измените элементы по своему усмотрению:

struct termios port_settings;
if (tcgetattr (fd, &port_settings) != 0)
            return -1;

cfsetispeed(&port_settings, B115200);
cfsetospeed(&port_settings, B115200);

port_settings.c_cflag &= ~(PARENB|CSTOPB|CSIZE);
port_settings.c_cflag |= CS8;

tcsetattr(fd, TCSANOW, &port_settings);
1 голос
/ 12 июля 2011

Вопрос, который вы должны задать себе, состоит в том, имеет ли serial_out правильное значение в точке, когда оно передается write(), после этого оно находится в вызове библиотеки, и уровень оптимизации модуля компиляции не будет влиять .

Большинство изменений в поведении между оптимизированным и неоптимизированным кодом связано с использованием undefined или определенной реализацией поведения компилятора, которое может изменяться между различными настройками компиляции. Код, который вам, вероятно, нужно показать здесь как все, что относится к переменной serial_out, а не к конфигурации порта.

В идеале, используйте ваш отладчик для проверки значения при вызове write(), хотя иногда это может быть трудно сделать с оптимизированным кодом, и вам может потребоваться прибегнуть к проверке регистров на предмет переменных, которые были оптимизированы.

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