jenya7 0 14 апреля, 2019 Опубликовано 14 апреля, 2019 · Жалоба Есть структура и в ней знаковое поле int32_t. Я пишу в это поле отрицательное значение mystruct.ival = -100; Потом сохраняю структуру во внутреннюю флэш и при ристарте считываю структуру из памяти и вижу mystruct.ival = -100. Есть такой же проект с тем же камнем с тем же кодом записи чтения во флэш. Но там при ристарте переменная не читается как отрицательная, и я получаю положительное число сколько то миллиардов. В чем может быть проблема? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 14 апреля, 2019 Опубликовано 14 апреля, 2019 · Жалоба В коде (каков вопрос таков ответ). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 апреля, 2019 Опубликовано 14 апреля, 2019 · Жалоба 1 hour ago, Kabdim said: В коде (каков вопрос таков ответ). код одинаков в плане чтения записи переменной. я скорее думаю в настройках проекта IAR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 14 апреля, 2019 Опубликовано 14 апреля, 2019 · Жалоба Ну ок, уточню, проблема в кривом коде. А если он секретный, то флаг в руки, барабан на шею. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 апреля, 2019 Опубликовано 14 апреля, 2019 (изменено) · Жалоба 2 hours ago, VladislavS said: Ну ок, уточню, проблема в кривом коде. А если он секретный, то флаг в руки, барабан на шею. запись чтения поля в структуре uint32_t COM_MotParam(uint32_t argc, char** args) { int32_t argument = 0; int32_t minlim; int32_t val = 0; if (command.val_ptr != NULL) { if (argc > 0) //write parametr { argument = atoi(args[1]); if (command.var_type == VAR_TYPE_BYTE) *(uint8_t*)command.val_ptr = argument; else if (command.var_type == VAR_TYPE_INT) *(uint32_t*)command.val_ptr = argument; else if (command.var_type == VAR_TYPE_SHORT) *(uint16_t*)command.val_ptr = argument; } else //read parameter { if (command.var_type == VAR_TYPE_BYTE) val = *(uint8_t*)command.val_ptr; else if (command.var_type == VAR_TYPE_INT) val = *((uint32_t*)command.val_ptr); else if (command.var_type == VAR_TYPE_SHORT) val = *((uint16_t*)command.val_ptr); Parser_SendInt(COM_USART, val, 1, 0); } return MSG_OK; } запись во флеш size = sizeof(MOTOR_SYS_PARAMS); offset = 0; addr = (uint32_t *)(flash_page + offset); status = WriteFlash(&motor_sys_params, addr, size); чтение из флеш size = sizeof(MOTOR_SYS_PARAMS); offset=0; addr = (uint32_t *)(flash_page + offset); memcpy(&motor_sys_params, addr, size); интересно почему кривой код в одном проекте работает в другом нет. Изменено 14 апреля, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 14 апреля, 2019 Опубликовано 14 апреля, 2019 · Жалоба Ну вот смотри. 1. У тебя проблема чтения/записи flash, а ты нам какую-то функцию COM_MotParam показываешь, которая к делу никакого отношения не имеет. Тупо посчитал в этой функции фигурные скобки и по формальному принципу вижу, что это фуфломицин. 2. Если в случае чтения сомнений в memcpy практически нет, это же стандартная функция, а не самописная затычка? То WriteFlash таки засекреченная? 3. Отладчиком посмотреть содержимое flash не судьба? Что там записано? Это автоматом отсечёт половину проблемы (чтение или запись неправильные). 4. Тип контроллера тоже секретный? У разных контроллеров есть тонкости по записи во flash, например, отключенный HSI может не давать писать. В одном проекте включен, а в другом нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 14 апреля, 2019 Опубликовано 14 апреля, 2019 · Жалоба 47 минут назад, jenya7 сказал: запись чтения поля в структуре else //read parameter { if (command.var_type == VAR_TYPE_BYTE) val = *(uint8_t*)command.val_ptr; else if (command.var_type == VAR_TYPE_INT) val = *((uint32_t*)command.val_ptr); else if (command.var_type == VAR_TYPE_SHORT) val = *((uint16_t*)command.val_ptr); Parser_SendInt(COM_USART, val, 1, 0); } Вангую, что частная проблема - в uint8_t/uint16_t/uint32_t. Убрать букву 'u' и полегчает. А общая проблема - конечно же в стиле. 47 минут назад, jenya7 сказал: интересно почему кривой код в одном проекте работает в другом нет. На то он и кривой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 апреля, 2019 Опубликовано 14 апреля, 2019 · Жалоба 1 hour ago, jcxz said: Вангую, что частная проблема - в uint8_t/uint16_t/uint32_t. Убрать букву 'u' и полегчает. А общая проблема - конечно же в стиле. На то он и кривой. это чтение с терминала - с ним проблем нет. проблема в чтении из флеш. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 14 апреля, 2019 Опубликовано 14 апреля, 2019 · Жалоба Ну так кокого полового уя ты нам код с которым нет проблем суёшь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 14 апреля, 2019 Опубликовано 14 апреля, 2019 · Жалоба 1 минуту назад, jenya7 сказал: это чтение с терминала - с ним проблем нет. проблема в чтении из флеш. А на кой тогда, извините, вы это привели??? Может вообще стоило привести кусок содержимого swap-файла винды? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 апреля, 2019 Опубликовано 14 апреля, 2019 (изменено) · Жалоба 1 hour ago, VladislavS said: Ну вот смотри. 1. У тебя проблема чтения/записи flash, а ты нам какую-то функцию COM_MotParam показываешь, которая к делу никакого отношения не имеет. Тупо посчитал в этой функции фигурные скобки и по формальному принципу вижу, что это фуфломицин. 2. Если в случае чтения сомнений в memcpy практически нет, это же стандартная функция, а не самописная затычка? То WriteFlash таки засекреченная? 3. Отладчиком посмотреть содержимое flash не судьба? Что там записано? Это автоматом отсечёт половину проблемы (чтение или запись неправильные). 4. Тип контроллера тоже секретный? У разных контроллеров есть тонкости по записи во flash, например, отключенный HSI может не давать писать. В одном проекте включен, а в другом нет. контролер stm32f303. функция записи во флеш - одинаковая, функция чтения из флеш - одинаковая. никаких предварительных настроек флеш я в обеих проектах не делаю. открыл два проекта и сравнил функции построчно. 1 hour ago, VladislavS said: Ну так кокого полового уя ты нам код с которым нет проблем суёшь? 1 hour ago, jcxz said: А на кой тогда, извините, вы это привели??? Может вообще стоило привести кусок содержимого swap-файла винды? потому что я не знаю где именно в коде проблема. и в коде вообще. Изменено 14 апреля, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 14 апреля, 2019 Опубликовано 14 апреля, 2019 · Жалоба Давай, отладчик в зубы и смотри что у тебя откуда читается/пишется и не морочь добрым людям голову. Там проверить то что читаешь/пишешь по нужному адресу и что по этому адресу лежит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 16 апреля, 2019 Опубликовано 16 апреля, 2019 · Жалоба On 4/14/2019 at 11:49 AM, jenya7 said: Но там при ристарте переменная не читается как отрицательная, и я получаю положительное число сколько то миллиардов. Покажите нам (лучше двумя скринами отладчика) где и в какой момент при чтении эти значения отличаются + содержимое вашего внутреннего флеша (через окно memory) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 16 апреля, 2019 Опубликовано 16 апреля, 2019 (изменено) · Жалоба Такая хрень (возможно) из-за различных настроек по выравниванию в структуре и их установки в разных модулях одного проекта. Когда pack установки получаются разные для одного и тогоже объявления структуры в разных модулях, а доступ к данным "перекрестный" из разных модулей. ------------ Версия с настройкой среды. Откройте одновременно два проекта и сравините ВСЕ настройки. Если аккуратно переключать окна - все параметры "наложены", и сравнить клацая кнопками переклжчения окон ЭЛЕМЕНТАРНО и быстро. Это чтобы найти причину. Изменено 16 апреля, 2019 пользователем k155la3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться