Jump to content

    

Проблема со знаковой переменной.

Есть структура и в ней знаковое поле int32_t.

Я пишу в это поле отрицательное значение mystruct.ival = -100;

Потом сохраняю структуру во внутреннюю флэш и при ристарте считываю структуру из памяти и вижу mystruct.ival = -100.

Есть такой же проект с тем же камнем с тем же кодом записи чтения во флэш. Но там при ристарте переменная не читается как отрицательная, и я получаю положительное число сколько то миллиардов.

В чем может быть проблема?

 

Share this post


Link to post
Share on other sites
1 hour ago, Kabdim said:

В коде (каков вопрос таков ответ).

код одинаков в плане чтения записи переменной. я скорее думаю в настройках проекта IAR.

 

Share this post


Link to post
Share on other sites

Ну ок, уточню, проблема в кривом коде. А если он секретный, то флаг в руки, барабан на шею.

Share this post


Link to post
Share on other sites
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);

 

интересно почему кривой код в одном проекте работает в другом нет.

Edited by jenya7

Share this post


Link to post
Share on other sites

Ну вот смотри.

1. У тебя проблема чтения/записи flash, а ты нам какую-то функцию COM_MotParam показываешь, которая к делу никакого отношения не имеет. Тупо посчитал в этой функции фигурные скобки и по формальному принципу вижу, что это фуфломицин. 

2. Если в случае чтения сомнений в memcpy практически нет, это же стандартная функция, а не самописная затычка? То WriteFlash таки засекреченная?

3. Отладчиком посмотреть содержимое flash не судьба? Что там записано? Это автоматом отсечёт половину проблемы (чтение или запись неправильные).

4. Тип контроллера тоже секретный? У разных контроллеров есть тонкости по записи во flash, например, отключенный HSI может не давать писать. В одном проекте включен, а в другом нет. 

 

Share this post


Link to post
Share on other sites
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 сказал:

интересно почему кривой код в одном проекте работает в другом нет.

На то он и кривой.

Share this post


Link to post
Share on other sites
1 hour ago, jcxz said:

Вангую, что частная проблема - в uint8_t/uint16_t/uint32_t. Убрать букву 'u' и полегчает.

А общая проблема - конечно же в стиле.

На то он и кривой.

это чтение с терминала - с ним проблем нет. проблема в чтении из флеш.

Share this post


Link to post
Share on other sites

Ну так кокого полового уя ты нам код с которым нет проблем суёшь?

Share this post


Link to post
Share on other sites
1 минуту назад, jenya7 сказал:

это чтение с терминала - с ним проблем нет. проблема в чтении из флеш.

А на кой тогда, извините, вы это привели??? Может вообще стоило привести кусок содержимого swap-файла винды?

Share this post


Link to post
Share on other sites
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-файла винды?

 

потому что я не знаю где именно в коде проблема. и в коде вообще.

Edited by jenya7

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
On 4/14/2019 at 11:49 AM, jenya7 said:

Но там при ристарте переменная не читается как отрицательная, и я получаю положительное число сколько то миллиардов.

Покажите нам (лучше двумя скринами отладчика) где и в какой момент при чтении эти значения отличаются + содержимое вашего внутреннего флеша (через окно memory)

 

Share this post


Link to post
Share on other sites

Такая хрень (возможно) из-за различных настроек по выравниванию в структуре и их установки в разных модулях одного проекта.

Когда pack установки получаются разные для одного и тогоже объявления структуры в разных модулях, а доступ

к данным "перекрестный" из разных модулей. 

------------

Версия с настройкой среды. Откройте одновременно два проекта и сравините ВСЕ настройки. Если аккуратно переключать окна - все параметры "наложены", и сравнить 

клацая кнопками переклжчения окон ЭЛЕМЕНТАРНО и быстро. Это чтобы найти причину.

 

Edited by k155la3

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now