Запись char в EEPROM

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

Стоит задача: реализовать с помощью EEPROM симуляцию работы с файлами, тоесть: у нас есть шесть файлов, в каждом по пять страниц, а каждая страница содержит по две строки, по 15 символов каждая (такие странные ограничения из-за размеров дисплея). Для этих целей я написал несколько функций, но они не работаю, подскажите, в чём проблма? В результате выполнения кода, на екран выводятся просто закрашеные прямоугольники(хотя в EEPROM уже записаны некоторые символы).

//Некий глобальный массив:
char tempStroke[16];

void memoryUpdate(byte adress, char value){//обновление ячейки памяти
  if(EEPROM.read(adress) != value){//если отличется от записаного
    EEPROM.write(adress, value);//запись в ячейку памяти
  }
} 

void getMemoryStroke(byte file, byte page, byte stroke){//запись строки из памяти в масссив tempStroke
  //6 файлов, по 5 страниц каждый, страница 2 строки по 15 символов - в сумме 900 байт
  int memoryTempByte = (file-1 * 150) + (page-1 * 30) + (stroke-1 * 15);//получаем данные о начале строки для получения
  for(int i = 0; i < 15; i++){//цыкл для считывания в массив
    tempStroke[i] = (char)EEPROM.read(memoryTempByte);//читаем с памяти
    memoryTempByte++;//двигаемся к следующей ячейке
  }
}

void setMemoryStroke(byte file, byte page, byte stroke){//запись строки в память из масссива tempStroke
  //6 файлов, по 5 страниц каждый, страница 2 строки по 15 символов - в сумме 900 байт
  int memoryTempByte = (file-1 * 150) + (page-1 * 30) + (stroke-1 * 15);//получаем данные о начале строки для записи
  for(int i = 0; i < 15; i++){//цыкл для записи из массива
    memoryUpdate(memoryTempByte, tempStroke[i]);//пишем в память
    memoryTempByte++;//двигаемся к следующей ячейке
  }
}

void printMemoryStroke(byte file, byte page, byte stroke){//печать строк из памяти
  getMemoryStroke(file, page, stroke);//получение строки из памяти в масссив tempStroke
  lcd.print(tempStroke);//выводим строку на екран
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

См. EEPROM.put()/.get()

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

sadman41 пишет:

См. EEPROM.put()/.get()

В этом нет необходимости. Когда проверяю по одному символу, допустим так:

EEPROM.write(950, 'a');
lcd.print((char)EEPROM.read(950));

То у меня всё работает, а мне нужно просто увеличить масштабы, чтобы работать сразу со строками, которые я смогу выводить на экран и для этого я написал эти функции, но не могу найти в них ошибку самостоятельно.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

а если после 29 строки поставить что выдает ?

Serial.print(tempStroke);

 

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

Valera19701 пишет:

а если после 29 строки поставить что выдает ?

Serial.print(tempStroke);

 

Сичто вот-такую фигню: ⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮

Символы вообще не читаются. 
sadman41
Offline
Зарегистрирован: 19.10.2016

Если читается фигня, то это значит, что пишется фигня.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Ictic_Step пишет:
но не могу найти в них ошибку самостоятельно.

Строка это массив символов - цикл по строке и посимвольно пишите в eeprom. Ищите по форуму пример - недавно была тема записи строки (Логин /пароль) в eeprom и её чтение.

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

я пишу и читаю строками, через структуру, в темах про маяк это есть

struct MyBeacon {
char call_sign[20];
char loc[7];
};

 

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

Я вас прошу, помогите просто найти ошибку в коде. Я реально не понимаю что я делаю не так. Я сократил весь код и получил две маленькие функции, но почему-то у них совершенно нелогичный результат роботы. Вот сам код:

void printMemoryStroke(int file, int page, int stroke){//
  //6 файлов, по 5 страниц каждый, страница 2 строки по 15 символов - в сумме 900 байт
  int memoryTempByte = (file-1 * 150) + (page-1 * 30) + (stroke-1 * 15);//получаем данные о начале строки
  for(int i = memoryTempByte; i < memoryTempByte+15; i++){
    lcd.print((char)EEPROM.read(i));//вывод на экран
  }
}

void readAllEEPROM(){//выводим в Serial всё, что есть в EEPROM
  byte tempCounter = 0;//переменная для красивого вывода в Serial
  for(int i = 0; i < 1023; i++){
    if(tempCounter < 40){
      Serial.print((char)EEPROM.read(i));
      tempCounter++;
    }else{
      Serial.println((char)EEPROM.read(i));
      tempCounter = 0;
    }
  }  
}

Вот что выводит в монитор порта функция readAllEEPROM():

А вот в результате работы printMemoryStroke(1, 1, 1), на lcd выводится Maxim1234567895. Вот что я делаю не так?

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

ua6em пишет:

я пишу и читаю строками, через структуру, в темах про маяк это есть

struct MyBeacon {
char call_sign[20];
char loc[7];
};

 

Что за "темы про маяк"?

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, сделайте маленький скетч с setup(), loop(), чтобы запустить можно было. Думаете, что кому-то интересно к вашим функциям дописывать ещё полкило кода?

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

sadman41 пишет:

Ну, сделайте маленький скетч с setup(), loop(), чтобы запустить можно было. Думаете, что кому-то интересно к вашим функциям дописывать ещё полкило кода?

Извините, не подумал. Вот:

#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>//библиотека для LCD

LiquidCrystal_I2C lcd(0x27,16,2);//LCD-экран

void setup() {
  Serial.begin(9600);
  lcd.init();//инициализация дисплея
  lcd.backlight();// Включаем подсветку дисплея
  lcd.setCursor(0,0);//курсор на начало строки

  printMemoryStroke(1,1,1);
  readAllEEPROM();
}

void loop() {

}


void printMemoryStroke(int file, int page, int stroke){//
  //6 файлов, по 5 страниц каждый, страница 2 строки по 15 символов - в сумме 900 байт
  int memoryTempByte = (file-1 * 150) + (page-1 * 30) + (stroke-1 * 15);//получаем данные о начале строки
  for(int i = memoryTempByte; i < memoryTempByte+15; i++){
    lcd.print((char)EEPROM.read(i));//вывод на экран
  }
}

void readAllEEPROM(){//выводим в Serial всё, что есть в EEPROM
  byte tempCounter = 0;//переменная для красивого вывода в Serial
  for(int i = 0; i < 1023; i++){
    if(tempCounter < 40){
      Serial.print((char)EEPROM.read(i));
      tempCounter++;
    }else{
      Serial.println((char)EEPROM.read(i));
      tempCounter = 0;
    }
  }  
}

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

попробуйте после записи каждого символа задержку по 10мс поставить

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

Valera19701 пишет:

попробуйте после записи каждого символа задержку по 10мс поставить

"Записи"? Но я ведь сейчас только пытаюсь читать и пока ничего не пишу... Но я всё же поставил задержку и ничего не изменилось.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Мне кажется, или в 23 строке математические формулы x-1*y неправильно считаются....скобок не хватает

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

andycat пишет:
Мне кажется, или в 23 строке математические формулы x-1*y неправильно считаются....скобок не хватает

Точно! Как же я сам не заметил? Спасибо тебе огромное, добрый человек!

sadman41
Offline
Зарегистрирован: 19.10.2016

Так же char tempStroke[16]; никогда не влезет в 15 байт.

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

sadman41 пишет:

Так же char tempStroke[16]; никогда не влезет в 15 байт.

Да, вы правы, спасибо - уже у меня  привычка с десктопного С++, чтобы выделять место для нулевого байта, а здесь он попросту не нужен. Исправляю.

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

Ictic_Step пишет:

ua6em пишет:

я пишу и читаю строками, через структуру, в темах про маяк это есть

struct MyBeacon {
char call_sign[20];
char loc[7];
};

 

Что за "темы про маяк"?

пост №1 пример 2, там всё и чтение и запись, проще наверное уже не сделать, тем более в теме корифеи здешние уже отметились и подсказали (читай написали) как надо делать )))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Кирпичи скрепляются растровом. Радиоэлементы паюят припоем. Доски скрепляют гвоздями. К чему я это говорю. ТС тупо забивает на типы переменных и объектов и воет почему у него криво все идет. А вы попытайтесь скреплять кирпичи гвоздями и у вас получится такая хрень.

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

qwone пишет:
Кирпичи скрепляются растровом. Радиоэлементы паюят припоем. Доски скрепляют гвоздями. К чему я это говорю. ТС тупо забивает на типы переменных и объектов и воет почему у него криво все идет. А вы попытайтесь скреплять кирпичи гвоздями и у вас получится такая хрень.

Вообще-то вы не правы. Ошибка была только из-за нехватки скобок в математическом выражении, которое определяет номер ячейки памяти, с которой нужно работать. А char без проблем пишется в EEPROM, ибо является по сути чисельной переменной, которая использует значения от 0 до 127, а может принимать значения от -127 до 127, в свою очередь каждую ячейку в EEPROM можно представить в виде переменной типа byte, которая принимает значения от 0 до 255, ну а с этого можно сделать вывод, что char можно напрямую писать в ячейки EEPROM одним байтом и преобразования из char в byte и наоборот будут работать корректно. Смотрите пруфы:

char - https://www.arduino.cc/en/Reference.Char

byte - https://www.arduino.cc/reference/en/language/variables/data-types/byte/

ASCII - https://www.arduino.cc/en/Reference/ASCIIchart

Так что, уберите, пожалуйста, свои гвозди, кирпичи и

qwone пишет:
растров
.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Язык Си оперирует данными только в ОЗУ. Если есть данные во флеш , eerom или где-то в удаленке то сначала их пишут в озу а потом оперируют. У фунции есть входные и выходные данные у которых есть типы. Ну и так далее . А то что вы подобрали и работает, то это метод тыка и затыка.

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

qwone пишет:
Язык Си оперирует данными только в ОЗУ. Если есть данные во флеш , eerom или где-то в удаленке то сначала их пишут в озу а потом оперируют. У фунции есть входные и выходные данные у которых есть типы. Ну и так далее . А то что вы подобрали и работает, то это метод тыка и затыка.

Что то такое чуство будто вы вообще не читали предыдущие сообщения. Зачем вы пишите об азах, которые все и так знают? Какой методы тыка, если всё просчитано? Я использую EEPROM только для сохранения данных, которые мне нужны после перезапуска платы.

Да и какой к черту Си если это С++?

Я вообще не понимаю почему вы сменили тему, причем здесь объяснение о функциях(кстати кто не зает этого изначально - по вашему сообщению и не поймёт)? При чем здесь флеш-память, если в ней храняться только скетчи? И что по вашему кроме переменных пишется в ОЗУ? Неужели все 30КБ флеша, во время работы сказочным образом падают в 2КБ ОЗУ?

Что-то, если честно, вы бред несёте.

nik182
Offline
Зарегистрирован: 04.05.2015

qwone пишет:
Язык Си оперирует данными только в ОЗУ. Если есть данные во флеш , eerom или где-то в удаленке то сначала их пишут в озу а потом оперируют. У фунции есть входные и выходные данные у которых есть типы. Ну и так далее . А то что вы подобрали и работает, то это метод тыка и затыка.

У тиньки 15 нет ОЗУ. Вообще нет. Но как то она работает и даже данными оперирует. А вот Си для неё написать не смогли. Нет ОЗУ. А без ОЗУ Си не работает.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

nik182,озу это те же регистры. Просто когда их очень мало, то большого смысла нет. А посмотрите ассемблрные скрипты на Ардуино. Там всегда идет замена ОЗУ на регистры.

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

nik182 пишет:
qwone пишет:
Язык Си оперирует данными только в ОЗУ. Если есть данные во флеш , eerom или где-то в удаленке то сначала их пишут в озу а потом оперируют. У фунции есть входные и выходные данные у которых есть типы. Ну и так далее . А то что вы подобрали и работает, то это метод тыка и затыка.
У тиньки 15 нет ОЗУ. Вообще нет. Но как то она работает и даже данными оперирует. А вот Си для неё написать не смогли. Нет ОЗУ. А без ОЗУ Си не работает.

Нет ОЗУ??? Больший бред, который я слышал в этой жизне, был о том, что "html компилируеться"! ОЗУ всегда есть, дело просто в том как она реализована, но ОЗУ всегда есть в мк, ибо без ОЗУ переменные в принципе существовать не могут. Предлагаю закрыть уже эту тему, ведь ваш бред и бред qwone уже переходит все границы, а самое главное совершенно не относится к первоначальному вопросу, который уже кстати решён.

negavoid
Offline
Зарегистрирован: 09.07.2016

Ictic_Step пишет:

Нет ОЗУ??? Больший бред, который я слышал в этой жизне, был о том, что "html компилируеться"! ОЗУ всегда есть, дело просто в том как она реализована, но ОЗУ всегда есть в мк, ибо без ОЗУ переменные в принципе существовать не могут. Предлагаю закрыть уже эту тему, ведь ваш бред и бред qwone уже переходит все границы, а самое главное совершенно не относится к первоначальному вопросу, который уже кстати решён.

У AtTiny15 нет ОЗУ. Только регистры. В них и живут логические переменные. Переменная не обязана жить в ОЗУ, как реализует компилятор, так и будет, могут жить хоть в ЕЕПРОМе, если ОЗУ нет.

А вот компилятор html: https://gohugo.io/

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:
У тиньки 15 нет ОЗУ. Вообще нет. Но как то она работает и даже данными оперирует. А вот Си для неё написать не смогли. Нет ОЗУ. А без ОЗУ Си не работает.
Ну, вообще-то, компьютер без ОЗУ существовать не может. "Минимальный" компьютер обязательно должен содержать:

- ЦП,

- ОЗУ,

- устройство ввода,

- устройство вывода.

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

andriano пишет:

nik182 пишет:
У тиньки 15 нет ОЗУ. Вообще нет. Но как то она работает и даже данными оперирует. А вот Си для неё написать не смогли. Нет ОЗУ. А без ОЗУ Си не работает.
Ну, вообще-то, компьютер без ОЗУ существовать не может. "Минимальный" компьютер обязательно должен содержать:

- ЦП,

- ОЗУ,

- устройство ввода,

- устройство вывода.

Этим двум что-то объяснять бесполезно - лучше не трать своё время, ведь всё равно ничего не докажешь.

negavoid
Offline
Зарегистрирован: 09.07.2016

Дык мне объясните :) Вот это, красненькое No в столбце SRAM: https://en.wikipedia.org/wiki/ATtiny_microcontroller_comparison_chart

Понимаете, andriano-то понимает, как attiny15 может существовать без ОЗУ, и nik182 понимает, и даже qwone.

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

negavoid пишет:

Дык мне объясните :) Вот это, красненькое No в столбце SRAM: https://en.wikipedia.org/wiki/ATtiny_microcontroller_comparison_chart

Понимаете, andriano-то понимает, как attiny15 может существовать без ОЗУ, и nik182 понимает, и даже qwone.


Если честно, первый раз вижу такое чудо, но также я вижу только 3 возможных вариантов существования данного агрегата:
1) ОЗУ внешняя и подключается как модуль
2) "Оно" умеет перезаписывать флеш-память на ходу.
3) Переменные не работают в принципе, а мк используется только для выполнения линейных повторяющихся алгоритмов.

Четвёртого здесь, как говорится, не дано.

nik182
Offline
Зарегистрирован: 04.05.2015

Ой да ладно. Те кто писал под неё понимают, что есть ещё четвертый способ. У меня она стоит в реле перенапряжения. Там как минимум реализован алгоритм фильтрации, что бы от наводок не срабатывало. А это сохранение данных АЦП, обработка, замер интервалов времени и количества периодов сети. И все промежуточные данные это переменные. Мир он ширее или ширше...

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

Ой, и я помню из детства, гулял проект звонок с мелодиями. БЕЗ ОЗУ! Даже вообще без МК - Z80 процессор и ПЗУ. И ничё, выкручивались. Куча мелодий, рандомно выбирались и проигрывались.) На асм естественно. Просто мозги иногда включать нужно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:
Ой да ладно. Те кто писал под неё понимают, что есть ещё четвертый способ.
Какой еще четвертый способ?

Часть микроконтроллера, предназначенная для перативного хранения данных, называется оперативным запоминающим устройством (ОЗУ). По определению.

Есть она? Есть! Иначе контроллер не смог бы функционировать. ЧТД.

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

andriano пишет:

Часть микроконтроллера, предназначенная для перативного хранения данных, называется оперативным запоминающим устройством (ОЗУ). По определению.

Есть она? Есть! Иначе контроллер не смог бы функционировать. ЧТД.

Ну, если регистры считать за ОЗУ... Вопрос в терминологии.)

astwo
Offline
Зарегистрирован: 10.07.2019

Green пишет:

Ну, если регистры считать за ОЗУ... Вопрос в терминологии.)


Нет здесь вопрос в понимании. У микропроцесора ОЗУ находящее в месте с ядром и имеющее свою шину данных адреса и управления называются регистрами. А вот внешнее ОЗУ со своей перефирией уже и есть традиционное ОЗУ. Но для современных контроллеров все получается в куче. Что для регистров что для ОЗУ все общее и все это на одном кристалле. И даже команды доступа практически одни и те же. И время доступа такое же. И что бы не смущать программистов старой закалки часть ОЗУ называют регистрами, а другую ОЗУ.

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

Касательно МК это понятно, а как быть с CPU? ОЗУ там внешнее (которого нет), но есть и регистры, адресуемые напрямую. И они не в одном и том же адресном пространстве. Но программа работает, без ОЗУ.)

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

а если хранить не в последовательной области? тут без структурирования данных не обойтись )))

astwo
Offline
Зарегистрирован: 10.07.2019

Green, здесь надо настроить компилятор языка си. Мол считать регистры с такого номера по такой свободными ячейка и памяти. Так даже плюс получается. Сразу регистров сделать много и не надо в стек пихать при переходе на подпрограмму. А так как р
абота производится компилятором, то не надо делать защиту от дурака-программиста

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

astwo пишет:
Green, здесь надо настроить компилятор языка си. Мол считать регистры с такого номера по такой свободными ячейка и памяти. Так даже плюс получается. Сразу регистров сделать много и не надо в стек пихать при переходе на подпрограмму. А так как р абота производится компилятором, то не надо делать защиту от дурака-программиста

ua6em пишет:
а если хранить не в последовательной области? тут без структурирования данных не обойтись )))

Green пишет:
Касательно МК это понятно, а как быть с CPU? ОЗУ там внешнее (которого нет), но есть и регистры, адресуемые напрямую. И они не в одном и том же адресном пространстве. Но программа работает, без ОЗУ.)

Извините ребята, что отвлекаю вас от настолько глубокого спора, что я уже в этой области некомпетентен, но может если вы такие профи(в хорошем смысле этого слова), то может поможете мне в соседнем топике с подключением блютуз модуля? Я с ним работаю в первый раз и уже несколько дней не могу его заставить функционировать. Буду благодарен тем, кто примет участвие в разборе этой проблемы: http://arduino.ru/node/31734

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Сначала светлодиодиком помигай при нас.  Мы ацэним квалификацию. От этого будут зависеть дальнейшие ответы. 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Ictic_Step пишет:

... но может если вы такие профис..., то может поможете мне в соседнем топике ...

Если вы такие умные, то чего строем не ходите?! 0^0

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

DetSimen пишет:

Сначала светлодиодиком помигай при нас.  Мы ацэним квалификацию. От этого будут зависеть дальнейшие ответы. 

Я так понимаю, если я реально напишу скетч по миганию светодиодиком, то вы будете долго смеятся, по-этому предоставлю вещи своего написания немного по-серъёзней.

Обработка нажатий аналоговой клавиатуры:

byte getPressedKeypadButton(){//считывает нажатия keypad`a
//возвращает значение от 1 до 16 в зависимости нажатой кнопки или 0 если ничего не нажато
  const byte OCCURACY = 5;//ошибка в точности
  int sensorValue = analogRead(KEYPAD_PIN);//читаем значение с датчика
  const int KEYS[] = {1016, 937, 860, 794, 683, 641, 604, 571, 509, 485, 464, 444, 407, 328, 275, 236};//массив значений для клавиш(0-15, где 0=1, 1=2 и т.д.), погрешность +-5
  if(sensorValue > -OCCURACY && sensorValue < OCCURACY){return 0;}
  keypadDelay = true;//записываем, что нужна будет задержка после нажатия
  for(unsigned short int i = 0; i < 16; i++){
    if(sensorValue > (KEYS[i] - OCCURACY) && sensorValue < (KEYS[i] + OCCURACY)){//если что-то совпадает
      return i+1;//отправляем индекс кнопки
    }else if(i == 15){//если всё проверено и ничего не совпадает
      return 0;//будем считать, что ничего не нажато
    }
  }
}

Функции для симуляции файловой системы, используя EEPROM:

void printMemoryStroke(int file, int page, int stroke){//вывод строки на lcd-екран
  //6 файлов, по 5 страниц каждый, страница 2 строки по 15 символов - в сумме 900 байт
  int memoryTempByte = ((file-1) * 150) + ((page-1) * 30) + ((stroke-1) * 15);//получаем данные о начале строки
  for(int adress = memoryTempByte; adress < memoryTempByte+15; adress++){
    lcd.print((char)EEPROM.read(adress));//вывод на экран
  }
}

void putMemoryStroke(int file, int page, int stroke){//запись строки в EEPROM из mWriteTemp[]
  //6 файлов, по 5 страниц каждый, страница 2 строки по 15 символов - в сумме 900 байт
  int memoryTempByte = ((file-1) * 150) + ((page-1) * 30) + ((stroke-1) * 15);//получаем данные о начале строки
  for(int adress = memoryTempByte; adress < memoryTempByte+15; adress++){
    if(mWriteTemp[adress-memoryTempByte] != '\0')
      updateMemory(adress, mWriteTemp[adress-memoryTempByte]);
    else
      updateMemory(adress, ' ');
  }
}

void updateMemory(int adress, char value){//обновляет ячейки памяти, если нужно
  char upTemp = EEPROM.read(adress);//читаем данные
  if(upTemp != value){//сравниваем данные
    EEPROM.write(adress, value);//перезапись данных
  }
}

P.S. Использую плату Wavgat, по-этому пришлось писать свой updateMemory(), ведь функции EEPROM.update() в библиотеке для этой платы попросту нет.

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

wdrakula пишет:

Ictic_Step пишет:

... но может если вы такие профис..., то может поможете мне в соседнем топике ...

Если вы такие умные, то чего строем не ходите?! 0^0

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

nik182
Offline
Зарегистрирован: 04.05.2015

andriano пишет:

nik182 пишет:
Ой да ладно. Те кто писал под неё понимают, что есть ещё четвертый способ.
Какой еще четвертый способ?

Часть микроконтроллера, предназначенная для перативного хранения данных, называется оперативным запоминающим устройством (ОЗУ). По определению.

Есть она? Есть! Иначе контроллер не смог бы функционировать. ЧТД.

Регистры процессора это не ОЗУ. Из ОЗУ данные нужно загрузить в регистры процессора что бы проводить мат. операции. Хранение промежуточных данных в регистрах известно и используется для ускорения обработки. Но при этом регистры процессора это не ОЗУ. На них невозможно построить стек и как следствие нельзя построить для таких процессоров язык высокого уровня.  

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Мда.  Я пас.  В сортах авна(кода) не разбираюсь.

Ictic_Step
Offline
Зарегистрирован: 15.07.2019

DetSimen пишет:

Мда.  Я пас.  В сортах авна(кода) не разбираюсь.

А что не так, скажите хоть?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ictic_Step пишет:

DetSimen пишет:

Мда.  Я пас.  В сортах авна(кода) не разбираюсь.

А что не так, скажите хоть?

Работодатели тебе все расскажут по твоему коду. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Green пишет:

Ну, если регистры считать за ОЗУ... Вопрос в терминологии.)

Два вопроса:

1. Является ли регистр запоминающим устройством?

2. Предназначены ли регистры для оперативного хранения информации?

 

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Green пишет:

Касательно МК это понятно, а как быть с CPU? ОЗУ там внешнее (которого нет), но есть и регистры, адресуемые напрямую. И они не в одном и том же адресном пространстве. Но программа работает, без ОЗУ.)

1. См. ответ выше.

2. В современных процессорах есть еще и кэш-память, нередко исчисляемая мегабайтами. Неужели это тоже регистры.

3. Как бы назначенеи (хранить оперативную информацию) не связано ни с наличием шины, ни со способом адресации. Кстати, регистры тоже, как правило, кодируются несколькими битами в команде. Чем не адресация?

4. Без ОЗУ программа работать не может. По определению.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:

Регистры процессора это не ОЗУ. Из ОЗУ данные нужно загрузить в регистры процессора что бы проводить мат. операции. Хранение промежуточных данных в регистрах известно и используется для ускорения обработки. Но при этом регистры процессора это не ОЗУ. На них невозможно построить стек и как следствие нельзя построить для таких процессоров язык высокого уровня.  

1. Если регистры процессора это не ОЗУ, тогда что это?

2. Разве есть закон, запрещающий производить мат. операции в ОЗУ?

3. С каких пор стек является:

3.1. - необходимым элементом компьютера?

3.2. - обязательным атрибутом ОЗУ?

4. Каким образом понятие ЯВУ имеет отношение к определению того, являеся некоторое устройство ОЗУ или нет?