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

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

04.06.2020, 21:56. Показов 1459. Ответов 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
Эксперт по электронике
6836 / 3260 / 338
Регистрация: 28.10.2011
Сообщений: 12,741
Записей в блоге: 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
Эксперт по электронике
6836 / 3260 / 338
Регистрация: 28.10.2011
Сообщений: 12,741
Записей в блоге: 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
13235 / 7730 / 1681
Регистрация: 25.05.2015
Сообщений: 23,551
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru