Предупреждение AVG-GCC
- Войдите на сайт для отправки комментариев
Сб, 25/06/2022 - 19:19
Прошу помочь/подсказать. Осваиваю avr-gcc.
Простая функция и все работает =
// Готовность UART приемника , если = 0 ТО Не ГОТОВ !! если <> 0 ТО ГОТОВ !!
uint8_t Uart0_readyRXC()
{
uint8_t mb;
#if defined (__AVR_ATmega328P__) || defined (__AVR_ATmega328__)
mb = UCSR0A & 0b10000000;
#endif
return mb;
}
НО !! при компиляции с ключем -Wall выдает следующее предупреждение =
uart.c:39:17: warning: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds]
39 | mb = UCSR0A & 0b10000000;
...........................^
Что делать ??
Выложить файл полностью. Посмотрев как это делают люди.
А код-то где?
mb = UCSR0A & 0b10000000;
странная строка на фоне других - что у этого бита 0b10000000 нет имени ? Смысл писать волшебные числа ?
Попробую выложить. Хотя код функции привел.
Просто отлаживаю библиотечки свои 2 шт + тест и того всего 6 файлов с заголовками, да и файл батника для компиляции.
Все работает, все функции проверены, делают, что я хочу, но вот попробовал компилировать с опцией -Wall
И вывалились сообщения - типа не нравиться.
Вот сама библиотечка, замечания все к ней.
// Файл работы с UART портами. Заголовок в файле uart.h // 06-2022 = Пока определено Atmega328P // Переменных НЕТ, определений НЕТ Только Заголовки Функций #if defined (__AVR_ATmega328P__) || defined (__AVR_ATmega328__) // Настройка USART 8 бит один стоп нет контроля четности #define Uart0_mUCSRB 0b00011000 // Байт в UCSR0B 00011000, Разрешить Прием, передачу и заголовок размера 8 бит // ТИПА = (1 << RXEN0) | ( 1<< TXEN0) ** RXEN0=4бит ** TXEN0=3бит #define Uart0_mUCSRC 0b00000110 // Байт в UCSR0C 00000110, Проверки Чет/Неч НЕТ, 1 стоповый и 8 бит прием/передача // Типа = (1<<UCSZ01) | (1 << UCSZ000) #else # error " uart.c = device type not defined" #endif #if defined F_cpu // Здесь ничего не делаем, только ОШИБКА #else # error " uart.c = F_cpu not defined" #endif // Иницилизация. Получаем 16 раз число как делитель частоты для нужной скорости // по уравнению = ff = ( F_cpu / (ss*16) ) - 1 void Uart0_init(uint16_t ss) { #if defined (__AVR_ATmega328P__) || defined (__AVR_ATmega328__) UBRR0L = ss; // UBRR0L = Uart_delitelLo; // Скорость Работы UART UBRR0H = ( ss >> 8 ); //UBRR0H = Uart_delitelHi; // Скорость Работы UART // Включить прием и передачу И Настроить формат : 8 data, 1 stop bit = нет четности UCSR0B = Uart0_mUCSRB; UCSR0C = Uart0_mUCSRC; #endif } // Готовность UART приемника , если = 0 ТО Не ГОТОВ !! если <> 0 ТО ГОТОВ !! uint8_t Uart0_readyRXC() { uint8_t mb; #if defined (__AVR_ATmega328P__) || defined (__AVR_ATmega328__) mb = UCSR0A & 0b10000000; #endif return mb; } // Готовность = Буфер Передатчик UART ПУСТ, если = 0 ТО Не ПУСТ !! если <> 0 ТО ПУСТ !! uint8_t Uart0_readyDRE() { uint8_t mb; #if defined (__AVR_ATmega328P__) || defined (__AVR_ATmega328__) mb = UCSR0A & 0b00100000; #endif return mb; } // Готовность ЛИНИИ/Сдивгового регистра // UART линия пуста , если = 0 ТО ЛИНИИ ЗАНЯТА!! если <> 0 ЛИНИЯ ПУСТА !! uint8_t Uart0_readyTXC() { uint8_t mb; #if defined (__AVR_ATmega328P__) || defined (__AVR_ATmega328__) mb = UCSR0A & 0b01000000; #endif return mb; } // Запись в UART передатчика БАйта void Uart0_writeByte(uint8_t vb) { #if defined (__AVR_ATmega328P__) || defined (__AVR_ATmega328__) UDR0 = vb; #endif } // Чтение из UART приемника Байта uint8_t Uart0_readByte() { uint8_t mb; #if defined (__AVR_ATmega328P__) || defined (__AVR_ATmega328__) mb = UDR0; #endif return mb; } // Запись в UART передатчика БАйта // ОЖИДАНИЕ ГОТОВНОСТИ ПЕРЕДАТЧИКА ЗДЕСЬ !! void Uart0_WaitWriteByte(uint8_t vb) { while ( Uart0_readyDRE() == 0 ) {}; Uart0_writeByte(vb); } // Запись в UART передатчика ПЕРЕХОД НА НОВУЮ СТРОКУ = ENTER // ОЖИДАНИЕ ГОТОВНОСТИ ПЕРЕДАТЧИКА ЗДЕСЬ !! void Uart0_WriteLN() { while ( Uart0_readyDRE() == 0 ) {}; Uart0_writeByte(13); } // Запись в UART передатчика СТРОКИ ТЕКСТА из ОЗУ // ОЖИДАНИЕ ГОТОВНОСТИ ПЕРЕДАТЧИКА ЗДЕСЬ !! void Uart0_WriteStr(char *st) { uint8_t ind; ind = 0; while ( st[ind] != 0 ) { Uart0_WaitWriteByte( st[ind]); ind = ind +1; } } // Запись в UART передатчика СТРОКИ ТЕКСТА из ОЗУ = И ПЕРЕХОД на НОВУЮ СТроку // ОЖИДАНИЕ ГОТОВНОСТИ ПЕРЕДАТЧИКА ЗДЕСЬ !! void Uart0_WriteStrLN(char *st) { uint8_t ind; ind = 0; while ( st[ind] != 0 ) { Uart0_WaitWriteByte( st[ind]); ind = ind +1; } Uart0_WriteLN(); } // Запись в UART передатчика СТРОКИ ТЕКСТА из ПЗУ ROM // ОЖИДАНИЕ ГОТОВНОСТИ ПЕРЕДАТЧИКА ЗДЕСЬ !! void Uart0_WriteFromFleshStr(const char *st) { uint8_t ind; char mst[50]; strcpy_P(mst, st); ind = 0; while ( mst[ind] != 0 ) { Uart0_WaitWriteByte( mst[ind]); ind = ind +1; } }Вот файл батника для компиляции
А вот сообщения компилятора
z:\work\AmXB\AVR_GCC\test1>echo avr-gcc compile !! avr-gcc compile !! In file included from Z:\work\AmXB\AVR_GCC\test1\hal.h:15, from Z:\work\AmXB\AVR_GCC\test1\main.c:2: Z:\work\AmXB\AVR_GCC\lib\convert.c: In function 'debugStr': Z:\work\AmXB\AVR_GCC\lib\convert.c:110:11: warning: variable 'ch' set but not used [-Wunused-but-set-variable] 110 | uint8_t ch; | ^~ In file included from Z:\work\AmXB\AVR_GCC\test1\hal.h:12: Z:\work\AmXB\AVR_GCC\lib\uart.c: In function 'Uart0_readyRXC': Z:\work\AmXB\AVR_GCC\lib\uart.c:39:17: warning: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds] 39 | mb = UCSR0A & 0b10000000; | ^ Z:\work\AmXB\AVR_GCC\lib\uart.c: In function 'Uart0_readyDRE': Z:\work\AmXB\AVR_GCC\lib\uart.c:49:18: warning: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds] 49 | mb = UCSR0A & 0b00100000; | ^ Z:\work\AmXB\AVR_GCC\lib\uart.c: In function 'Uart0_readyTXC': Z:\work\AmXB\AVR_GCC\lib\uart.c:60:18: warning: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds] 60 | mb = UCSR0A & 0b01000000; | ^ In function 'Uart0_readyDRE', inlined from 'Uart0_WaitWriteByte' at Z:\work\AmXB\AVR_GCC\lib\uart.c:87:10: Z:\work\AmXB\AVR_GCC\lib\uart.c:49:18: warning: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds] 49 | mb = UCSR0A & 0b00100000; | ^ In function 'Uart0_writeByte', inlined from 'Uart0_WaitWriteByte' at Z:\work\AmXB\AVR_GCC\lib\uart.c:88:2: Z:\work\AmXB\AVR_GCC\lib\uart.c:69:11: warning: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds] 69 | UDR0 = vb; | ^ In function 'Uart0_readyDRE', inlined from 'Uart0_WriteLN' at Z:\work\AmXB\AVR_GCC\lib\uart.c:95:10: Z:\work\AmXB\AVR_GCC\lib\uart.c:49:18: warning: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds] 49 | mb = UCSR0A & 0b00100000; | ^ In function 'Uart0_writeByte', inlined from 'Uart0_WriteLN' at Z:\work\AmXB\AVR_GCC\lib\uart.c:96:2: Z:\work\AmXB\AVR_GCC\lib\uart.c:69:11: warning: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds] 69 | UDR0 = vb; | ^ In function 'Uart0_readByte', inlined from 'debugStr' at Z:\work\AmXB\AVR_GCC\lib\convert.c:113:8: Z:\work\AmXB\AVR_GCC\lib\uart.c:78:8: warning: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds] 78 | mb = UDR0; | ^ In function 'Uart0_readyRXC', inlined from 'main' at Z:\work\AmXB\AVR_GCC\test1\main.c:24:11: Z:\work\AmXB\AVR_GCC\lib\uart.c:39:17: warning: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds] 39 | mb = UCSR0A & 0b10000000; | ^ In function 'Uart0_readByte', inlined from 'main' at Z:\work\AmXB\AVR_GCC\test1\main.c:25:8: Z:\work\AmXB\AVR_GCC\lib\uart.c:78:8: warning: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds] 78 | mb = UDR0; | ^ In function 'Uart0_readyDRE', inlined from 'main' at Z:\work\AmXB\AVR_GCC\test1\main.c:26:11: Z:\work\AmXB\AVR_GCC\lib\uart.c:49:18: warning: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds] 49 | mb = UCSR0A & 0b00100000; | ^ In function 'Uart0_writeByte', inlined from 'main' at Z:\work\AmXB\AVR_GCC\test1\main.c:27:3: Z:\work\AmXB\AVR_GCC\lib\uart.c:69:11: warning: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds] 69 | UDR0 = vb; | ^Тест простой, не думаю что это влияет на сообщения =
#include "hal.h" // Тест Эхо со своей функцией UART uint8_t ch; uint16_t wd; char *nst; char mst[20]; char *pst; const char sMess[] PROGMEM = {" THIS ROM FLESH !! "}; int main(void) { // strcpy_P(mst, sMess); nst = " Bla Bla Bla "; // mst = " GU GU GU "; ch = 0; Uart0_init(832); // ff = ( F_cpu / (ss*16) ) - 1 = ( 16000000 / (1200*16) -1 ) = 832,33 wd=0x0A88; while (1) { while ( Uart0_readyRXC() == 0 ) {}; ch = Uart0_readByte(); while ( Uart0_readyDRE() == 0 ) {}; Uart0_writeByte(ch); Uart0_WaitWriteByte('*'); Uart0_WriteLN(); Uart0_WaitWriteByte('!'); Uart0_WaitWriteByte('*'); Uart0_WriteStr(nst); Uart0_WriteLN(); Uart0_WriteStrLN(" TY TY TY "); ByteToBinStrPr(ch, mst); Uart0_WriteStrLN( mst ); // И ТАК ByteToStrZer(ch, mst); Uart0_WriteStrLN( &mst[0] ); // И ТАК ch=wd; ByteToHexStr(ch, mst); Uart0_WriteStrLN( &mst[0] ); WordToHexStr(wd, mst); Uart0_WriteStrLN( mst ); WordToStrZer(wd, mst); Uart0_WriteStrLN( mst ); wd=wd+1; debugStr(" WAIT ENTER ! "); WordToStrZer(wd, mst); Uart0_WriteStrLN( mst ); wd=wd+1; Uart0_WriteFromFleshStr( sMess ); Uart0_WriteLN(); } }Наверно все выложить - проще архивом или еще как ?
Завтра посмотрю, если раньше никто не подскажет.
Посмотреть на определение UCSR0A мозгов не хватило, конечно же.
второй раз за последнее время не вижу подключение опций компиляции в теле программы, что так?
строчки 7 и 16 последнего кода. Переменная nst - это неинициализированнй указатель на строку. Ну или как назвал это компилятор - массив нулевого размера. Когда вы пытаетесь ему что-то присвоить - происходит выход за границу, о чем вам компилятор и говорит:
А то что ошибки указывают на строчки в библиотеке - наверно потому что вы пытаетесь эту несуществующую строку передать по UARt
строчки 7 и 16 последнего кода .
Переменная nst - это не инициализированнй указатель на строку.....
Спасибо. Да это ошибка. НО Это не помогло. Я пошел далее и убрал вообще все. Оставил одну функцию и вызов ее. Проблема осталось. Смотрите это код, всего одна функция м вызов =
#include "D:\WP\AVR_GCC\avr\include\avr\io.h" uint8_t Uart0_readyRXC() { uint8_t mb; mb = UCSR0A & 0b10000000; return mb; } uint8_t ch; int main(void) { ch = 0; while (1) { while ( Uart0_readyRXC() == 0 ) {}; } }Всего одна строка батника для компиляции
и Вот список ПРЕДУПРЕЖДЕНИЙ ! При использовании опции -Wall
z:\work\AmXB\AVR_GCC\test2>D:\WP\AVR_GCC\BIN\avr-gcc.exe -g -Wall -Os -mmcu=atmega328p -c Z:\work\AmXB\AVR_GCC\test2\main.c Z:\work\AmXB\AVR_GCC\test2\main.c: In function 'Uart0_readyRXC': Z:\work\AmXB\AVR_GCC\test2\main.c:5:15: warning: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds] 5 | mb = UCSR0A & 0b10000000; | ^ In function 'Uart0_readyRXC', inlined from 'main' at Z:\work\AmXB\AVR_GCC\test2\main.c:14:12: Z:\work\AmXB\AVR_GCC\test2\main.c:5:15: warning: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds] 5 | mb = UCSR0A & 0b10000000; | ^ z:\work\AmXB\AVR_GCC\test2>pauseКак решить это я не понимаю.
Посмотреть на определение UCSR0A мозгов не хватило, конечно же.
Пошел Еще ДАЛЬШЕ. Сменил версию пакета AVR-GCC.
При использовании пакета из WbnAvr2010 – ПРЕДУПРЕЖДЕНИЙ НЕТ !! сообщает о версии = 4.3.3
При использовании пакета из Arduino вер 1.8.19 - – ПРЕДУПРЕЖДЕНИЙ НЕТ !! сообщает о версии = 7.3.0
У меня стоял пакет версии AVR-GCC 12.1.0 x64 = avr-gcc-12.1.0-x64-windows = якобы скаченного с github.com вот такая вот фигня. Сообщает о версии = 12.1.0
Кому верить и как с этим жить не понятно.
Т. Е. ПРОБЛЕМУ ПРЕДУПРЕЖДЕНИЙ СНИМАЮ. НЕТ ЕЕ. ЕСТЬ ПРОБЛЕМА в самом компилятора или его версий.
Решил тут вот освоить avr-gcc, хотя 5 лет писал и пишу на MP. Но для общество я изгой. Для общения с обществом решил вот писать на avr-gcc. И вот первые 2 дня на avr-gcc и такие вот выкрутасы. Главное нет определенности, придется учиться жить с неопределенными правилами.
Спасибо ВСЕМ
Посмотреть на определение UCSR0A мозгов не хватило, конечно же.
Не понял.
UCSR0A определен вот так = #define UCSR0A _SFR_MEM8(0xC0) - это адрес регистра и могу его использовать с таким именем.
Это то, о чём я хотел сказать. Старайтесь локализировать ошибку и минимизировать код для её проверки. Т.е., коль вы просите, то должны всё выложить на блюдечке. Что бы любой желающий, без лишних телодвижений, смог проверить у себя.
avr-gcc -mmcu=atmega328p -Wall -Os -c -o test.o test.c
avr-gcc (GCC) 7.3.0
Посмотреть на определение _SFR_MEM8 мозгов не хватило, конечно же.