Предупреждение AVG-GCC

wasq
Offline
Зарегистрирован: 26.05.2018

Прошу помочь/подсказать. Осваиваю 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;

...........................^



Что делать ??

Green
Offline
Зарегистрирован: 01.10.2015

Выложить файл полностью. Посмотрев как это делают люди.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А код-то где?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

mb = UCSR0A & 0b10000000;

странная строка на фоне других - что у этого бита 0b10000000 нет имени ? Смысл писать волшебные числа ?

wasq
Offline
Зарегистрирован: 26.05.2018

Попробую выложить. Хотя код функции привел.

Просто отлаживаю библиотечки свои 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; }

 } 

Вот файл батника для компиляции

echo  avr-gcc compile !!
@echo off
set path_cmp=D:\WP\AVR_GCC\BIN\
set path_txt=Z:\work\AmXB\AVR_GCC\test1\
set file_cmp=main
set mi_cpu="-mmcu=atmega328p"
rem -Wall =выводит предупреждение !! ошибки не влияющие на исполнение  
%path_cmp%avr-gcc.exe -g -Wall -Os %mi_cpu% -c %path_txt%%file_cmp%.c
%path_cmp%avr-gcc.exe -g -Os %mi_cpu% -o %path_txt%%file_cmp%.elf  %path_txt%%file_cmp%.o
%path_cmp%avr-objcopy -j .text -j .data -O   ihex %path_txt%%file_cmp%.elf   %path_txt%%file_cmp%.hex
%path_cmp%avr-objdump.exe  -d %path_txt%%file_cmp%.elf  > %file_cmp%.asd
%path_cmp%avr-size  %path_txt%%file_cmp%.elf > %path_txt%%file_cmp%.asz
pause

А вот сообщения компилятора

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();
		
    }

}

Наверно все выложить - проще архивом или еще как ?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Завтра посмотрю, если раньше никто не подскажет.

rkit
Offline
Зарегистрирован: 23.11.2016

Посмотреть на определение UCSR0A мозгов не хватило, конечно же.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

второй раз за последнее время не вижу подключение опций компиляции в теле программы, что так?

b707
Offline
Зарегистрирован: 26.05.2017

строчки 7 и 16 последнего кода. Переменная nst - это неинициализированнй указатель на строку. Ну или как назвал это компилятор - массив нулевого размера. Когда вы пытаетесь ему что-то присвоить - происходит выход за границу, о чем вам компилятор и говорит:

 warning: array subscript 0 is outside array bounds

А то что ошибки указывают на строчки в библиотеке -  наверно потому что вы пытаетесь эту несуществующую строку передать по UARt

wasq
Offline
Зарегистрирован: 26.05.2018

b707 пишет:

строчки 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 ) {};
    }
}

Всего одна строка батника для компиляции

D:\WP\AVR_GCC\BIN\avr-gcc.exe -g -Wall -Os -mmcu=atmega328p -c Z:\work\AmXB\AVR_GCC\test2\main.c
pause

и Вот список ПРЕДУПРЕЖДЕНИЙ ! При использовании опции  -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

Как решить это я не понимаю.

 

 

rkit
Offline
Зарегистрирован: 23.11.2016

rkit пишет:

Посмотреть на определение UCSR0A мозгов не хватило, конечно же.

wasq
Offline
Зарегистрирован: 26.05.2018

Пошел Еще ДАЛЬШЕ. Сменил версию пакета 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 и такие вот выкрутасы. Главное нет определенности, придется учиться жить с неопределенными правилами.

Спасибо ВСЕМ

 

wasq
Offline
Зарегистрирован: 26.05.2018

rkit пишет:

Посмотреть на определение UCSR0A мозгов не хватило, конечно же.

Не понял. 

UCSR0A определен вот так = #define UCSR0A _SFR_MEM8(0xC0) - это адрес регистра и могу его использовать с таким именем. 

Green
Offline
Зарегистрирован: 01.10.2015

wasq пишет:
Я пошел далее и убрал вообще все. Оставил одну функцию и вызов ее. Проблема осталось. Смотрите это код, всего одна функция...


Это то, о чём я хотел сказать. Старайтесь локализировать ошибку и минимизировать код для её проверки. Т.е., коль вы просите, то должны всё выложить на блюдечке. Что бы любой желающий, без лишних телодвижений, смог проверить у себя.
avr-gcc -mmcu=atmega328p -Wall -Os   -c -o test.o test.c

Program:      34 bytes (0.1% Full)
(.text + .data + .bootloader)
 
Data:          1 bytes (0.0% Full)
(.data + .bss + .noinit)

avr-gcc (GCC) 7.3.0

rkit
Offline
Зарегистрирован: 23.11.2016

Посмотреть на определение _SFR_MEM8 мозгов не хватило, конечно же.