Jump to content

    
jenya7

Передача константного значения в указатель.

Recommended Posts

Есть структура с указателями на переменные

typedef struct
{
    void *l_var; 
    void *r_var;   
}IN_EXPR;

IN_EXPR expression;

Я ее инициализирую

void * SCRIPT_ParseInVar(char * var)
{
    uint32_t mot_num;
    
    if(strncmp(var,"pos",3)==0)
    {
        if (strlen(var) < 4)
            return 0;
        mot_num = atoi(&var[4]);
        if (mot_num > MAX_IDX)
            return 0;
        else
           return &motor_rt_params[mot_num].position;
    }
    
    return 0;
}

if (expression.l_var == NULL)
    expression.l_var = SCRIPT_ParseInVar(token);

А если я хочу значение указателя инициализировать константой? То есть мне не важно на какой адрес будет указывать l_var главное чтоб значение было скажем 100 (*l_var = 100).

Можно как то поизвращаться на этот счет?

 

Share this post


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

const uint8_t SOME_CONST = 100;

expression.l_var = &SOME_CONST;

 

тогда мне нужно добавить

typedef struct
{
    void *l_var; 
    void *r_var;  

    int32_t const_val;
}IN_EXPR;

это раздувает структуру.

Share this post


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

необязательно это в структуру добавлять

мне потом все это дело нужно во флеш сохранить. и у меня будет массив структур.

Edited by jenya7

Share this post


Link to post
Share on other sites
4 minutes ago, jenya7 said:

мне потом все это дело нужно во флеш сохранить.

значение для инициализации в любом случае нужно где-то хранить, как ни извращайся

Share this post


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

значение для инициализации в любом случае нужно где-то хранить, как ни извращайся

*((int*)(expression.l_var)) = 100;

даже не ругается. вопрос как это сохранить.

Share this post


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

*((int*)(expression.l_var)) = 100;

даже не ругается. вопрос как это сохранить.

Вот только делает не то, что вы хотели. Ваш код портит ту ячейку памяти, на которую указывал expression.l_var.

То, что вы хотели, выглядит вот так:

{
	static int Value = 100;
	expression.l_var = &Value; 
}

 

Share this post


Link to post
Share on other sites
2 hours ago, Сергей Борщ said:

Вот только делает не то, что вы хотели. Ваш код портит ту ячейку памяти, на которую указывал expression.l_var.

То, что вы хотели, выглядит вот так:


{
	static int Value = 100;
	expression.l_var = &Value; 
}

 

я понял. как ни крути придется выделить область констант.

 

интересно а если я пишу в коде if ( (var - 100) > 50 ) где сохраняются константные значения 100 и 50 после компиляции? есть специальная область во флеш памяти?

Edited by jenya7

Share this post


Link to post
Share on other sites
2 часа назад, jenya7 сказал:

интересно а если я пишу в коде if ( (var - 100) > 50 ) где сохраняются константные значения 100 и 50 после компиляции? есть специальная область во флеш памяти? 

Прочитайте про секции памяти (.text, .data, .bss, .noinit, .rodata и т.п.).

Share this post


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

Прочитайте про секции памяти (.text, .data, .bss, .noinit, .rodata и т.п.).

меня как раз интересует и т.п. интересно как конвейер формирует машинные команды к исполнению. в опкоде команды ведь не зашиты указатели на переменные и константы.

Share this post


Link to post
Share on other sites
3 часа назад, jenya7 сказал:

интересно а если я пишу в коде if ( (var - 100) > 50 ) где сохраняются константные значения 100 и 50 после компиляции? есть специальная область во флеш памяти?

В таких (простых)  случаях компилятор использует инструкции, работающие с immediate value, или же располагает константы в теле кода, где-то "неподалеку" от текущего адреса выполнения (регистр PC) с near-доступом относительно PC. Таким образом, расходования области констант не происходит, к тому же это намного быстрее, чем "лазить" в другой сегмент памяти.

Share this post


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

меня как раз интересует и т.п. интересно как конвейер формирует машинные команды к исполнению. в опкоде команды ведь не зашиты указатели на переменные и константы.

за семь лет так и не научиться смотреть ассемблерный код ? Да и участники каждый раз тычут вас носом в ассемблер.

 

Share this post


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

В таких (простых)  случаях компилятор использует инструкции, работающие с immediate value, или же располагает константы в теле кода, где-то "неподалеку" от текущего адреса выполнения (регистр PC) с near-доступом относительно PC. Таким образом, расходования области констант не происходит, к тому же это намного быстрее, чем "лазить" в другой сегмент памяти.

понял. спасибо.

1 hour ago, megajohn said:

за семь лет так и не научиться смотреть ассемблерный код ? Да и участники каждый раз тычут вас носом в ассемблер.

 

mov r0, #10 - отсюда не ясно где лежит 10 после линкера.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.