Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901

Искажение массивов

04.06.2020, 21:56. Показов 1455. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Раньше писал под пк, теперь есть проект, который нужно сопровождать на c под микроконтроллер, и в общих чертах столкнулся с проблемой искажением данных:
C
1
2
const char value_1[]={4,4,7,4,7,4,6,1,1,8}; 
const char value_2[]={0,0,2,1,0,0,2,0,0,6};
Как видите объявлены константами, нигде в коде их значение не меняю, да и не могу собственно: константы в C не меняются.
Когда я вывожу на экран первый массив, выводится все корректно.
Второй массив почему-то искажается: в первой половине массива появляется какое-то значение 32, которое я не указывал. Вообще, массив портится именно значением 32. Что это за магическое число?
Пробовал переставлять массивы местами, ситуация меняется: тот, который объявлен первым выводится без проблем, тот который вторым - искажается. Почему это может быть. Есть у кого идеи?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.06.2020, 21:56
Ответы с готовыми решениями:

Искажение дискретных сигналов
Как влияет скорость передачи информации на степень искажений дискретных сигналов при наличии амплитудно - и фазо-частотных искажений?

Искажение формы сигнала
Есть схема. В ней используется полудуплексная передача с помощью программного UART (9600 б/с). За основу была взята схема на полевом...

Искажение данных из-за пульсо мера
Всем доброго времени суток! Я использую датчик пульса и GSM модуль SIM808. два этих модуля Пульс https://pulsesensor.com/ и GSM модуль...

30
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
05.06.2020, 06:03
Цитата Сообщение от minore Посмотреть сообщение
Почему это может быть. Есть у кого идеи?
памяти не хватает
посему главный вопрос что за камень?
Цитата Сообщение от minore Посмотреть сообщение
в общих чертах столкнулся с проблемой
здесь нет "общих черт" слишком много задействовано нюансов
второй вопрос: Что за компилятор?
ибо
Цитата Сообщение от minore Посмотреть сообщение
const char
это неизменные величина, а куда его разместить в ОЗУ или в ПЗУ решает компилятор, точнее линкер
1
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
05.06.2020, 09:41  [ТС]
За ответ спасибо. Хорошо, что есть хоть объяснение. А то бред такой пишешь одно значение - он тебе другое подставляет.
Среда разработки Atmel Studio 7.0.
0
Эксперт по электронике
6830 / 3254 / 338
Регистрация: 28.10.2011
Сообщений: 12,716
Записей в блоге: 7
05.06.2020, 11:40
Цитата Сообщение от ValeryS Посмотреть сообщение
куда его разместить в ОЗУ или в ПЗУ решает компилятор, точнее линкер
Все же компилятор. Он раскидывает код по секциям и в зависимости от того в какую попадут данные, они будут в флеше или ОЗУ. Линкер в принципе эти вопросы решать не может, т. к. во многих МК для доступа к флешу и озу требуются разные асм инструкции.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
05.06.2020, 12:12
Цитата Сообщение от minore Посмотреть сообщение
Среда разработки Atmel Studio 7.0.
а камень?
за атмел студио ничего не могу сказать, давно не работаю
но по моему раньше для размешения во флеше(тоже ПЗУ) нужно было писать ключевое слово PROGMEM
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
05.06.2020, 17:59
Цитата Сообщение от minore Посмотреть сообщение
А то бред такой пишешь одно значение - он тебе другое подставляет.
покажите, как вы выводите значения?
Цитата Сообщение от ValeryS Посмотреть сообщение
за атмел студио ничего не могу сказать, давно не работаю

Не по теме:

(gcc может скопировать значения массива сама из FLASH в RAM, но учитывать что это константа).


Цитата Сообщение от ValeryS Посмотреть сообщение
вопрос что за камень?
актуальный вопрос, как и наложение участков RAM. Возможно, вы портите значения в другом коде.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
05.06.2020, 18:28
Цитата Сообщение от Voland_ Посмотреть сообщение
gcc может скопировать значения массива сама из FLASH в RAM, но учитывать что это константа
в том то и дело
массив лежит в флеш но при старте переносит это в RAM
нужно чтобы всегда лежало во флешь и по коду обращалось к нему
ключевое слово PROGMEM так и позволяет сделать но я не помню к какому компилятору это относится
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
05.06.2020, 20:33
Цитата Сообщение от ValeryS Посмотреть сообщение
к какому компилятору это относится
к avr gcc и относится... Все верно говоришь. И гарантировать, что данные не поменяются таким образом, тоже можно
1
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
06.06.2020, 12:20  [ТС]
ValeryS, мне больше всего понравилась версия про нехватку памяти. Хотелось бы как-то убедится или опровергнуть эту версию, так как если памяти действительно не хватает или она в притык, то в принципе код нужно будет переписывать, чтобы не было сюрпризов в других местах. По сему вопрос: Как можно ррасчитать , сколько памяти задействовано при работе моей программы? Можно ли как то вручную это сделать, даже если это муторно?
Всего доступно 4 кб оперативной памяти.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
06.06.2020, 12:58
minore, при компиляции программы пишется все ресурсы flech eeprom ram
но у каждого компилятора это по своему
еще раз повторю: Atmel Studio я не знаю
1
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
07.06.2020, 19:44
Цитата Сообщение от minore Посмотреть сообщение
Как можно ррасчитать , сколько памяти задействовано при работе моей программы?
в gcc есть тула, которая выводит количество откушенных ресурсов. Называется gcc-size... Но насколько я знаю, она не считает количество занятых данных на стеке, и вложенность функций. Соответственно, для этой задачи чаще всего используют т.н. "stack analizer". именно эта тула помогает оценить, теоретическую "вершину стека". На практике же иногда полезно просто сделать дамп памяти и посмотреть сколько памяти использовалось. Обычно, если она использовалась - ее контент не нулевой, и таким образом, можно понять что было использовано, а что нет.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
07.06.2020, 19:49
minore, хочешь покажу как можно испортить второй массив
C
1
2
for(int i=0;i<sizeof(value_1)+20;i++)
  value_1[i]=i;
и все, 20 элементов 2 массива испорчены
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
09.06.2020, 09:29
Цитата Сообщение от ValeryS Посмотреть сообщение
и все, 20 элементов 2 массива испорчены
(в этом случае - очень вероятно, но не всегда так. потому что во-первых, gcc может взять стратегию размещения переменных в памяти "задом наперед", во-вторых, он их перемешивает, достигая наибольшей оптимальности как в размере так и скорости доступа).
Это я к тому, что результат может быть не таким как ожидается ). Для этого есть более надежные способы...
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
09.06.2020, 09:52
Цитата Сообщение от Voland_ Посмотреть сообщение
Для этого есть более надежные способы...
для UB!?
ну ты, барин, и даешь
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
09.06.2020, 13:13
Цитата Сообщение от ValeryS Посмотреть сообщение
для UB!?
what's that?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
09.06.2020, 14:02
UB - undefined behavior (Неопределенное поведение)
выход за пределы массива чистое UB
https://habr.com/ru/post/216189/
и тут такое заявление
Цитата Сообщение от Voland_ Посмотреть сообщение
Для этого есть более надежные способы...
надежные для UB
1
Эксперт по электронике
6830 / 3254 / 338
Регистрация: 28.10.2011
Сообщений: 12,716
Записей в блоге: 7
09.06.2020, 20:05
Цитата Сообщение от ValeryS Посмотреть сообщение
выход за пределы массива чистое UB
Я думаю что дело в другом. ТС дал подсказку.
Цитата Сообщение от minore Посмотреть сообщение
Вообще, массив портится именно значением 32. Что это за магическое число?
Он похоже использует sprintf или что-то подобное и записывая больше чем размер массива, пробелами затирает данные в другом массиве.
0
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
09.06.2020, 20:14  [ТС]
Контроллер: риалабовский MC12D8O .
Проверил занятую память: память программ 28% память данных 67%.
Отказался от массивов, переписал логику без них. Стала затираться переменная, которая была выше массивов. И тоже либо значением 0 либо 32.
Ушел от проблемы следующим образом: из Main все объявления переменных перенес в глобальную область. Все заработало, ничего не затирается.
Объясните, почему в локальной и глобальной области работает по-разному. Человек, который до меня вел проект ппредложил смотреть Map проекта, сопоставлять адреса переменных, потому что одна может затирать другую. Почему это может быть? Как одна переменная может затереть другую?
Простите за нубские вопросы, но очень хочу разобраться, если есть , что почитать на эту тему - буду благодарен. Но то, что если я из локальной области перенес в глобальную и все заработало говорит о том, что ошибка точно не в алгоритме/ коде.

Добавлено через 6 минут
"""Он похоже использует sprintf """ в точку. Но только для отладки, когда уже все сломалось. А 32 - это код пробела?
0
Эксперт .NET
 Аватар для Rius
13228 / 7725 / 1679
Регистрация: 25.05.2015
Сообщений: 23,542
Записей в блоге: 14
09.06.2020, 20:20
Цитата Сообщение от minore Посмотреть сообщение
ValeryS, мне больше всего понравилась версия про нехватку памяти. Хотелось бы как-то убедится или опровергнуть эту версию, так как если памяти действительно не хватает или она в притык, то в принципе код нужно будет переписывать, чтобы не было сюрпризов в других местах. По сему вопрос: Как можно ррасчитать , сколько памяти задействовано при работе моей программы? Можно ли как то вручную это сделать, даже если это муторно?
Всего доступно 4 кб оперативной памяти.
Это не рассчитывают.
Заполняют всю ОЗУ паттерном, через линкер скрипт или программно.
Запускают программу.
Смотрят, какие области озу были перезаписаны в ходе её работы.
Обычная проблема - стек задачи слишком мал и при помещении в него данных они вылезли за пределы выделенной стеку области, да затёрли то, что лежало ниже (глобальные переменные).

Добавлено через 2 минуты
Чуть более продвинуто - прямо в ходе работы программы она проверяет, что нижняя граница стека имеет заданный паттерн и не была затёрта. Если таки была - падаем и вопим о вопиющей ошибке дизайна.
0
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
09.06.2020, 20:24  [ТС]
Rius , Ровно наоборот. Когда я описание переменных из main убрал в глобальную область - все заработало. Затиралось то, что в main. загадка, но факт.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.06.2020, 20:24
Помогаю со студенческими работами здесь

Искажение аудиосигнала при ресемплинге Ланцоша
Есть представление дискретного аудио-сигнала в виде амплитудных отсчетов с частотой дискретизации 16000 Гц. Необходим его ресемплинг на...

Что вызывает искажение нижних и верхних пиков сигнала?
Что вызывает искажение нижних и верхних пиков сигнала?

Даны пять массивов А(4,4),В(4,4),С(4,4),D(4,4)F(4,4).Найти произведение массивов. определение произведения двух массивов оформить в виде процедур
Даны пять массивов А(4,4),В(4,4),С(4,4),D(4,4)F(4,4).Найти произведение массивов. определение произведения двух массивов оформить в виде...

искажение окон
Доброго времени суток! Помогите, пожалуйста, решить проблему искажения изображений. Так понимаю, что искажаются окна связанные с явой.

Искажение изображения
Нашел хороший пример создания изображения, можно ли итог как-то исказить до всем известной капчи(немного размазать, думаю понятно что...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru