Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 29.08.2019
Сообщений: 13
1

Компилятор выдает ошибку преобразования [-fpermissive] для STM32 и ESP32

09.07.2020, 09:42. Просмотров 1030. Ответов 13
Метки нет (Все метки)

Здравствуйте. Прошу помощи знающих.
При компиляции выдает ошибку преобразования типа переменной
- invalid conversion from 'const ADI_REG_TYPE*' {aka 'const unsigned char*'} to 'byte*' {aka 'unsigned char*'} [-fpermissive]

при использовании плат STM32f103c8 и ESP32.
При компиляции для плат AVR такой ошибки нет, проходит всё нормально. Подскажите где копать для решения этой проблемы.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <Wire.h>
void setup() {
  IC_Default_Download();
}
 
void SIGMA_WRITE_REGISTER_BLOCK(byte IC_address, word subAddress, int dataLength, byte pdata[]) {
  
  Wire.beginTransmission(IC_address);
  uint8_t addressLowByte = subAddress & 0xff;
  uint8_t addressHighByte = (subAddress >> 8);
 
  Wire.write(addressHighByte); 
  Wire.write(addressLowByte); 
 
  if (dataLength < 50 ) {
    for (int i=0; i<dataLength; i++) { 
      Wire.write(pdata[i]); //write data bytes
    }
  }
  else { 
    for (int i=0; i<dataLength; i++) {
      Wire.write(pgm_read_byte_near(pdata + i)); //write data bytes from PROGMEM (for param and program data)
    }
  }
  Wire.endTransmission();
  
}
 
void IC_Default_Download() {
 
 
  typedef unsigned short ADI_DATA_U16;
  typedef unsigned char  ADI_REG_TYPE;
 
  
 /********************************************************************************************************/
  
  #define DEVICE_ADDR_IC_1                                          0x68  
  #define REG_COREREGISTER_IC_1_ADDR                       0x081C
  #define PROGRAM_ADDR_IC_1                                       0x0400
  #define PARAM_ADDR_IC_1                                           0x0000                   
 
/******************************************************************************************************/
 
  #define REG_COREREGISTER_IC_1_BYTE                      2
  #define R3_HWCONFIGURATION_IC_1_SIZE                 24
  #define PROGRAM_SIZE_IC_1                                      5120
  #define PARAM_SIZE_IC_1                                           4096
                         
/********************************************************************************************************/
 
  ADI_REG_TYPE R0_COREREGISTER_IC_1_Default[REG_COREREGISTER_IC_1_BYTE] = {0x00, 0x18};
  ADI_REG_TYPE R3_HWCONFIGURATION_IC_1_Default[R3_HWCONFIGURATION_IC_1_SIZE] = {0x00, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
  ADI_REG_TYPE R4_COREREGISTER_IC_1_Default[REG_COREREGISTER_IC_1_BYTE] = {0x00, 0x1C};
  
const static ADI_REG_TYPE Program_Data_IC_1[PROGRAM_SIZE_IC_1] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x01, 
0x00, 0x00, 0x00, 0xE8, 0x01, 
0x00, 0x01, 0x08, 0x20, 0x01, 
...........
0x00, 0x00, 0x00, 0x00, 0x01,  
};
 
const static ADI_REG_TYPE Param_Data_IC_1[PARAM_SIZE_IC_1] PROGMEM = { 
0x00, 0x00, 0x0D, 0x6F, 
0x00, 0x00, 0x15, 0xF4, 
0x00, 0x00, 0x12, 0x06, 
0x00, 0x00, 0x15, 0xF4, 
0x00, 0x00, 0x13, 0x01, 
0x00, 0x00, 0x16, 0x48, 
........... 
0x00, 0x00, 0x00, 0x00,  
};
 
  SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, REG_COREREGISTER_IC_1_ADDR, REG_COREREGISTER_IC_1_BYTE, R0_COREREGISTER_IC_1_Default );
  SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, PROGRAM_ADDR_IC_1, PROGRAM_SIZE_IC_1, Program_Data_IC_1 );
  SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, PARAM_ADDR_IC_1, PARAM_SIZE_IC_1, Param_Data_IC_1 );
  SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, REG_COREREGISTER_IC_1_ADDR , R3_HWCONFIGURATION_IC_1_SIZE, R3_HWCONFIGURATION_IC_1_Default );
  SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, REG_COREREGISTER_IC_1_ADDR, REG_COREREGISTER_IC_1_BYTE, R4_COREREGISTER_IC_1_Default );
}
//-------------------------------------------------------------------------------------------------------------------------------
 
void loop() {
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.07.2020, 09:42
Ответы с готовыми решениями:

Элементарный класс для работы с файлами, компилятор выдает ошибку, что не так с private
#include &lt;ctime&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;iostream&gt;...

Компилятор выдает ошибку
#include &quot;stdafx.h&quot; #include&quot;cstdlib&quot; #include&quot;iostream&quot; #include&quot;vector&quot; #include...

Компилятор выдает ошибку
Работаю в Code::Blocs. Компилятор выдает ошибку: &quot;LAB 2 - Debug&quot; uses an invalid compiler....

компилятор выдает ошибку
после запуска программы компилятор выдает окно с сообщением: &quot;необработанное исключение в...

13
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
09.07.2020, 10:26 2
Цитата Сообщение от Frostokus Посмотреть сообщение
при использовании плат STM32f103c8 и ESP32
Цитата Сообщение от Frostokus Посмотреть сообщение
const static ADI_REG_TYPE Param_Data_IC_1[PARAM_SIZE_IC_1] PROGMEM = {
Цитата Сообщение от Frostokus Посмотреть сообщение
void loop()
странно как то
компилятор то какой?



Цитата Сообщение от Frostokus Посмотреть сообщение
- invalid conversion from 'const ADI_REG_TYPE*' {aka 'const unsigned char*'} to 'byte*' {aka 'unsigned char*'} [-fpermissive]
строчку на которую ругается
0
0 / 0 / 0
Регистрация: 29.08.2019
Сообщений: 13
09.07.2020, 10:43  [ТС] 3
Здравствуйте. пробовал разные редакторы Arduino IDE/Platformio+Vcode по сути одна и та же библиотека с https://github.com/stm32duino/Arduino_Core_STM32.
Я просто не пойму в чем причина. да ругается на массивы размером свыше 255 т.е. byte Program_Data_IC_1, Param_Data_IC_1 хотя из них передаю побайтно в функции
C
1
void SIGMA_WRITE_REGISTER_BLOCK(byte IC_address, word subAddress, int dataLength, [B]byte[/B] pdata[])
Добавлено через 41 секунду
С ESP32 так же - invalid conversion from 'const ADI_REG_TYPE*' {aka 'const unsigned char*'} to 'byte*' {aka 'unsigned char*'} [-fpermissive]

Добавлено через 9 минут
Также пробовал разные версии менеджера плат STM32 Cores, безрезультатно. arm-none-eabi 9.2.1
0
2573 / 1165 / 152
Регистрация: 28.10.2011
Сообщений: 4,113
Записей в блоге: 6
09.07.2020, 11:10 4
Уберите для начала PROGMEM. Это же не AVR.

Зачем такие сложности с типами? Вместо ADI_REG_TYPE используйте uint8_t.
0
0 / 0 / 0
Регистрация: 29.08.2019
Сообщений: 13
09.07.2020, 12:10  [ТС] 5
"Вместо ADI_REG_TYPE используйте uint8_t." пробовал замену всех одинаковых типов, не решает проблему.

Убрал PROGMEM, при компиляции ошибка та же.

sketch_jul09a:75:51: error: invalid conversion from 'const uint8_t*' {aka 'const unsigned char*'} to 'uint8_t*' {aka 'unsigned char*'} [-fpermissive]
75 | SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, PARAM_ADDR_IC_1, PARAM_SIZE_IC_1, Param_Data_IC_1 );

Добавлено через 21 минуту
В другом коде указатель программной памяти мне не мешал и компилировалось нормально.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <Wire.h> 
#define EEPROM_ADDRESS 0x34 
#include "VolTables.h"
 
void setup() {
  write_i2c((uint32_t)pgm_read_dword(&Volume[39]));
}
 
void write_i2c(uint32_t param_vol) {
  Wire.begin();
  Wire.beginTransmission(EEPROM_ADDRESS);
  Wire.write(0x0000 >> 8); 
  Wire.write(0x0000 & 0xFF); 
  Wire.write((param_vol & 0xFF000000) >> 24);
  Wire.write((param_vol & 0xFF0000) >> 16);
  Wire.write((param_vol & 0xFF00) >> 8);
  Wire.write((param_vol & 0xFF));
  Wire.endTransmission();
}
 
void loop() {
}
 
где VolTables.h
const uint32_t Volume[] PROGMEM = 
{
0x00002941,
0x000033EF,
0x00004161,
0x0000524F,
........
};
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
09.07.2020, 12:12 6
Цитата Сообщение от Frostokus Посмотреть сообщение
void SIGMA_WRITE_REGISTER_BLOCK(byte IC_address, word subAddress, int dataLength, byte pdata[])
не описание функции, а строчка где возникает ошибка
Цитата Сообщение от Frostokus Посмотреть сообщение
пробовал разные редакторы Arduino IDE/Platformio
перенести тему в ардуино?
0
0 / 0 / 0
Регистрация: 29.08.2019
Сообщений: 13
09.07.2020, 12:13  [ТС] 7
Я не могу найти ошибку довольно долго, что не так я не понимаю.
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
09.07.2020, 12:15 8
Цитата Сообщение от Frostokus Посмотреть сообщение
что не так я не понимаю.
приведение типов
для этого и прошу строчку
0
0 / 0 / 0
Регистрация: 29.08.2019
Сообщений: 13
09.07.2020, 12:23  [ТС] 9
"не описание функции, а строчка где возникает ошибка"
в вызовах функции
SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, PROGRAM_ADDR_IC_1, PROGRAM_SIZE_IC_1, Program_Data_IC_1 );
SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, PARAM_ADDR_IC_1, PARAM_SIZE_IC_1, Param_Data_IC_1 );

Да но это проблема не только в Arduino IDE я ранее написал.
Я не смогу быстро переделать на HALe.

Добавлено через 6 минут
Скрин ошибки
Компилятор выдает ошибку преобразования [-fpermissive] для STM32 и ESP32
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
09.07.2020, 12:58 10
Лучший ответ Сообщение было отмечено Frostokus как решение

Решение

Frostokus, выдели нужный текст, который хочешь процитировать, появится кнопка "цитата", нажми на неё
Цитата Сообщение от Frostokus Посмотреть сообщение
SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, PROGRAM_ADDR_IC_1, PROGRAM_SIZE_IC_1, Program_Data_IC_1 );
попробуй привести типы
C
1
2
SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, PROGRAM_ADDR_IC_1, PROGRAM_SIZE_IC_1, (byte *)Program_Data_IC_1 );
SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, PARAM_ADDR_IC_1, PARAM_SIZE_IC_1,(byte *) Param_Data_IC_1 );
0
0 / 0 / 0
Регистрация: 29.08.2019
Сообщений: 13
09.07.2020, 13:14  [ТС] 11
Огромное спасибо, помогло. Но вопрос всё таки повис, почему при компиляции AVR нет ошибки типов char и byte, и явный перевод делать не обязательно?
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
09.07.2020, 14:16 12
Цитата Сообщение от Frostokus Посмотреть сообщение
почему при компиляции AVR нет ошибки типов char и byte, и явный перевод делать не обязательно?
потому что С++(ардуино) и С это разные языки
и что дозволено Юпитеру, то не дозволено быку

Добавлено через 2 минуты
Цитата Сообщение от Frostokus Посмотреть сообщение
нет ошибки типов char и byte,
ты не путай не char и byte а const char и byte
char и const char это разные типы
0
0 / 0 / 0
Регистрация: 29.08.2019
Сообщений: 13
09.07.2020, 14:52  [ТС] 13
Я объявил const константой массив для запрета изменений, и в данном случаи
C
1
2
const static ADI_REG_TYPE(char) Param_Data_IC_1[PARAM_SIZE_IC_1] PROGMEM = {
}
изменился на тип const char?

Тогда для нормальной компиляции достаточно убрать константу const в массивах.
C
1
2
static ADI_REG_TYPE Param_Data_IC_1[PARAM_SIZE_IC_1] = {} 
static ADI_REG_TYPE Program_Data_IC_1[PROGRAM_SIZE_IC_1] = {}
Но тогда будут ли защищены данные в массивах от изменений, если они не будут константой?

Добавлено через 8 минут
Стало более менее понятно, спасибо, тему можно закрывать.
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
09.07.2020, 16:10 14
Цитата Сообщение от Frostokus Посмотреть сообщение
изменился на тип const char?
он не изменился, ты его так и объявил
Цитата Сообщение от Frostokus Посмотреть сообщение
тогда для нормальной компиляции достаточно убрать константу const в массивах.
модификатор const в микроконтроллерах имеет еще одну сущность
перемененные кладутся в область памяти программ, архитектура то гарвардская-память программ и память данных разные сущности
в отличии от ПК где большинство фонНемановская архитектура, и память данных и память программ суть одно и тоже


Цитата Сообщение от Frostokus Посмотреть сообщение
спасибо, тему можно закрывать.
правила п2.3
Сообщения и темы, а также другой контент, размещаемый на форуме, по просьбам пользователей не удаляется и не закрывается.
Добавлено через 3 минуты
Цитата Сообщение от Frostokus Посмотреть сообщение
спасибо
правила п 3.6
Если какой-либо пост на форуме показался вам полезным, то вы можете выразить свою благодарность, нажав кнопку "Спасибо" внизу самого поста.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.07.2020, 16:10

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Компилятор выдает ошибку
Здравствуйте, уважаймые! Нуждаюсь в помощи ибо стал в ступор. Пишу задание по оплате стоянки...

Компилятор выдает ошибку
a:=strtoint(StringGrid1.Cells); ошибка not enough actual parameters не могу понять почему...

Компилятор выдает ошибку
Пишет, что в последней строчке несовместимые типы type tkniga = record iz : string; ...

Компилятор выдает ошибку
Всех приветствую. Хочу портировать исходники под другой проект на компиляторе gcc чистый си....

Компилятор выдаёт ошибку
Я новичок в C++ и не могу понять в чём ошибка написал вот такой код: #include &lt;iostream&gt;...

Компилятор выдаёт ошибку.
Program z1; var n:integer; begin Writeln('Архитектор Исаакиевского собора: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.