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

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

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

Подробнее

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

четыре раза

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

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

Всё бы так, но только до первого 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...

  • Сообщения

    • Лишний нагрев КРЕНок 
    • Сделал себе 300-вольтовый пробник для светодиодов, преобразователь из Радио №3/1988 г., потом стабилизатор тока, ссылку на который давал Краб. Получилось очень даже не плохо, качает любые линейки.  
    • Походу, "приделать полотно к смычку" (штангенциркуль использовать как гаечный ключ) - как раз и есть "окуенное желание что-то написать на форуме."   Чиста жизненная среднестатистическая  выборка: 8-ми квартирный  дом, 8 семей самого среднего класса (рабочие, служащие (не армия), строитель, воспитатель, педагог, пенсионер....) и возраста (от 0.5, до 85)... у всех есть либо набор ключей, либо пассатижи, либо разводной ключ....., штангенциркуль есть только у меня (и не один, помимо прочего нужного инструментария) . Это я к тому, если у человека нет подходящего ключа, то у него скорее всего (99% )  нет и штангенциркуля. И типа "совет": - Если нет подходящего ключа, то воспользуйтесь штангенциркулем!! выглядит как: -  Если у Вас  в нужный момент не оказалось туалетной бумаги, то воспользуйтесь стекловатой. С уважением, Сергей
    • Нашел в своих закромах, продаю. Вроде не сильно б/у, лет так несколько назад я его проверял, светили все "пиксели" фото с инета, свои прикреплю чуть позже. Октябрьск , Самарской обл. 2500р.  
    • Зря, муйню надо возвращать обратно.
    • Как каким боком? Да хотя бы "лампочками" поморгать...
  • Покупай!

×
×
  • Create New...