All streams
Search
Write a publication
Pull to refresh
45
0

Инженер-электронщик

Send message
Плате лет 12-13. Ноуту 16. Раньше на совесть делали :)
Тот анализатор которым я пользуюсь, выдает именно такие предупреждения…
Не разу он мне не выдал такого предупреждения, которое мне удалось исправить.
Хочется понять его логику. Может дело во мне.
Давно хочу спросить… Объясните логику анализатора (не вашего)
Неопределенный порядок выполнения

#pragma pack(push,1) 
typedef union
  {
  struct eeprom_tag
    {                                                                          
    signed short D0;
    signed short D1;
    unsigned char  CRC; 
    };
  unsigned char EepromAlignment[((sizeof(struct eeprom_tag)+2)/4)*4]; 
  }                                                                            
  eeprom_t;  
#pragma pack(pop)    
...
eeprom_t Ep;
...
Ep.CRC=GetCRC((unsigned char*)&Ep, sizeof(struct eeprom_tag)-sizeof(Ep.CRC) );   


Откуда предупреждение? В аргументах функции побочных эффектов нет, а sizeof вообще вычисляется на этапе компиляции.
Как писать чтобы предупреждения не было?
Не целесообразно. К Сименсу не протолкнешься, а для для решения насущных проблем хватает Модбас.
дык это оно и есть.

там еще выше защита для коротких пакетов
if(UkPaket<8) continue;

В натуре! сейчас проверил на Kepware,
задал мастеру блок чтения дискретных входов 16, а в слейву 8

что возвращаешь слайвом ILLEGAL_DATA_ADDRESS, что ILLEGAL_DATA_VALUE
Kepware пишет
Date Time Level User Name Source Event
05.11.2020 19:39:58 2 Default User Modbus Serial Bad address in block [000002 to 000012] on device 'c1.d1'
Вспомнил почему я не делал обработку ошибок!
Все дело в неоднозначности трактовок функций ошибок 2 (ILLEGAL_DATA_ADDRESS) и 3 (ILLEGAL_DATA_VALUE).
Каждый трактует их как хочет.
Некоторые изучают стили форматирования, правила именования переменных итд. итп. А некоторые просто пишут.
Нельзя же утверждать что Достоевский не писатель, на основании почерка.
Моя практика показывает, что это не так уж и надо. А код раздувается.
В следующей версии сделаю как опцию.
В качестве «калибра» использовал OPCсервер Kepware. Методику тестирования описывать долго. Но покрытие 100%!
ModBus точно не из тех протоколов, для которых надо (и стоит) из главного цикла запускать ModBusRTU/ASCII(). Так как ModBus (почти?) всегда не единственная функция устройства, то времена начинают плавать. А это не здорово.

Я тоже так когда-то думал… Но лет 15 как отпустило…
Пожалуйста, не судите строго… это литературный прием, гипербола.
Немножечко утомили программисты пришедшие в эмбедед! Они пытаются притащить технологии десктопов в i51.

Используйте «паттерн Синглтон»! В эмбедеде его только и используют, уже лет 40!

Ждем на Хабре публикаций вроде «используйте целочисленную арифметику», или «не используйте printf»!
Сюжет напомнил «4 комнаты». Для пущего эффекта надо было закончить также
youtu.be/1qP4bXEDPXU?t=18
Пока остальные персонажи играют в корпоративный квест, главный герой собирает банкноты со стола и скрывается в тумане.
А мне кажется проблема только одна.
image
Возможно лучше сделать это через третью промежуточную функцию на ассемблере, которая только и делает, что устанавливает указатель стека.


Что я и делаю без этих хлопот…
Мне ОС нужна для возможности использования чужих исходников, написанных в блокирующем стиле.
Не хиляет…
Как найти точку входа в задачу?

Information

Rating
Does not participate
Location
Россия
Registered
Activity