Jump to content
Jabus

rcall

Recommended Posts

зачем он это делает? может я чего-то не понимаю, но помоему это засорение стека.

апрпаорпо.png

Share this post


Link to post
Share on other sites

Оставляем на стеке адрес. Остается вопрос - зачем два раза.

Сишную программу можно увидеть?

Share this post


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

по моему это засорение стека.

четыре раза pop  r0  перед выходом исключают переполнение,  выравнивая количество записей-чтений стека.

Share this post


Link to post
Share on other sites

Вебинар STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

Компания Компэл приглашает вас 25 сентября принять участие в вебинаре, который посвящен новому семейству микроконтроллеров STM32G0. Вебинар рассчитан на технических специалистов и тех, кто хорошо знаком с семейством STM32. На вебинаре будут освоены современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0 и проведено их подробное сравнение.

Подробнее

2 часа назад, my504 сказал:

четыре раза

Если бы так... rcall только оставляет на вершине адрес возврата, а сам указатель как был так и остается неизменным.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
                     

Литиевые батарейки Fanso в беспроводных датчиках пожарно-охранной сигнализации

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

Подробнее...

Всё бы так, но только до первого ret. В итоге остаемся при своих, только в стеке остался адрес возврата.

37 минут назад, my504 сказал:

бабушкам у подъезда расскажите.

Не устраивайте истерику. Мы говорим же о вопросе ТС, а не о работе стека.

Share this post


Link to post
Share on other sites

Причем тут ret? Ret вернет в PC ровно то, на что указывает указатель стека. POP переведет указатель на нкобходимую позицию, возмещая отсутствие ret у двух пустых вызовов. 

 

Share this post


Link to post
Share on other sites

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

Стек не переполняется. 

Share this post


Link to post
Share on other sites
Posted (edited)

void u32_color(uint32_t h){
    R_color=*(h+0);
    G_color=*(h+1);
    B_color=*(h+2);
}

18 часов назад, солар сказал:

Оставляем на стеке адрес. Остается вопрос - зачем два раза.

Сишную программу можно увидеть?

 

17 часов назад, my504 сказал:

четыре раза pop  r0  перед выходом исключают переполнение,  выравнивая количество записей-чтений стека.

считай при выполнение каждой такой функции минимум 6 байт в озу,ну а если много таких функций будет? стек может залезть на переменные... в attiny13 такое запросто провернуть, там всего 64 байта.

Edited by Jabus
так надо

Share this post


Link to post
Share on other sites

Это ВСЕГО четыре слова. Чтобы они суммировались, нужна вложенность функций. 

И таки да, если ОЗУ крошечное, то оно может быстро закончиться. И произойдет это совсем не из-за стека. 

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

Ну и учитывать уровень оптимизации, канешна. 

 

Share this post


Link to post
Share on other sites
On 6/17/2019 at 6:57 AM, Jabus said:

зачем он это делает?

Компиляторы аргуметны функций передают через стэк. Соответственно для функции void u32_color(uint32_t h) он помещает в стек 4 байта, а при выходе их удаляет. Для других типов он наверно использует другие команды типа push.

Share this post


Link to post
Share on other sites
Только что, snn_krs сказал:

Компиляторы аргуметны функций передают через стэк.

Сферические компиляторы в вакууме. AVR-GCC до 8 параметров передает в регистрах, и только сверх этого - через стек (разумеется, от размера параметров зависит тоже).

Не понятен вообще интерес к тому, что делает компилятор - раз делает, значит, так надо. 

Share this post


Link to post
Share on other sites
5 часов назад, my504 сказал:

Это ВСЕГО четыре слова. Чтобы они суммировались, нужна вложенность функций. 

И таки да, если ОЗУ крошечное, то оно может быстро закончиться. И произойдет это совсем не из-за стека. 

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

Ну и учитывать уровень оптимизации, канешна. 

 

если не ошибаюсь стек идет с конца озу и ниже, и если будет 3-4 вложенные функции то 6*4=24 байта, если там будут лежать переменные то он и покоцает.

Share this post


Link to post
Share on other sites
Только что, Jabus сказал:

и если будет 3-4 вложенные функции то 6*4=24 байта

Вы посмотрите на код внимательно: там задействовано 6 байт стека сверх тех двух, что потрачены на вызов самой функции. К чему фантазии о 24 байтах?

Share this post


Link to post
Share on other sites

На скриншоте видно, что функция main( uint32_t x ) тоже задана с аргументом и 6 байт стека сразу используются. Сделайте функцию main( void ) и освободятся 6 байт.

Share this post


Link to post
Share on other sites

я нашел на зарубежных форумах, что gcc использует стек для локальных переменных

Share this post


Link to post
Share on other sites

Именно так и есть. Но в вашем случае непонятно откуда берутся rcall.

Share this post


Link to post
Share on other sites
В 20.06.2019 в 11:13, солар сказал:

Но в вашем случае непонятно откуда берутся rcall.

а чего там непонятного то - сэкономили разработчики компилятора - вместо 4-х инструкций вставили две.

Share this post


Link to post
Share on other sites
Posted (edited)

знаю какие у меня кривые руки, так что не бомбите а укажите где ошибка

вот код (написан в arduino IDE для вывода данных)
void setup(){
  uint16_t t;
  Serial.begin(115200);
  asm volatile(
    "RCALL .+0  \n"
    "POP %B[a]  \n"
    "POP %A[a]  \n"
    :
    [a] "+r" ((uint16_t)t)
  );
  Serial.println(t,HEX);
}

void loop(){}

изображение.png

Edited by Jabus

Share this post


Link to post
Share on other sites

зачем ты создаешь новую тему об одном и том же, если у тебя уже есть созданная тема.

я объединил обе темы в одну.

Share this post


Link to post
Share on other sites

я уже понял свою ошибку, у меня была проблема, что я вытаскивал данные из стека (после rcall), там был адрес в словах, а я думал в байтах

Share this post


Link to post
Share on other sites

где же ты видел, чтобы адрес состоял из одного байта?

 

Share this post


Link to post
Share on other sites

я предположил т.к. rjmp и jmp переходят по байтам.

но проблемы продолжаются. компилятор что-то делает с командами sts и lds, если рядом дотрагивались до одних и тех же переменных.5d16833fdc49c_.thumb.png.a72341be2fa92f8feb66dd26d0720497.png

Share this post


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

я предположил т.к. rjmp и jmp переходят по байтам.

все команды имеют размер слова, а слово состоит из двух байт.

поэтому ты предположил глупость, и ни о каком переходе по байтам речи быть не может.

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.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  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.

Loading...

×
×
  • Create New...