Перейти к содержанию
    

Подскажите как IAR работает с typedef struct

Ситуация такая

 

Во время выполнения программы (номинальная загрузка стека ОЗУ 10% свободно 90%) вызывается некоторая процедура пусть П1. В процедуре П1 объявляется typedef struct, которая съедает стек ОЗУ на 90% контроллера (так было задуманно), выполняется нужные действия, данные выводятся, и осуществляется выход с процедуры П1.

 

Такой вопрос а как поступит компилятор IAR с ОЗУ когда выйдет с процедуры П1, вернёт обратно стек к 10%, или стуктура останится висеть в ОЗУ контроллера и останится свободно 100-90=10% ОЗУ ???

 

IAR AVR.4.21

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В процедуре П1 объявляется typedef struct, которая съедает стек ОЗУ на 90% контроллера (так было задуманно),

typedef struct к памяти отношения вообще не имеет, ибо это объявление типа, а не определение переменной...

 

Если вы в процедуре создаете в стеке объекты, то после выхода их процедуры они будут автоматически уничтожены. Если создаете в куче, то уже вы сами ответственны за их удаление. Если объекты - статические переменные в функции или глобальные - они живут вечно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

/* MD5 context. */
typedef unsigned char      uint8;
typedef unsigned long      uint32;


typedef struct {
        uint32 state[4];    // state (ABCD)                           
        uint32 count[2];    // number of bits, modulo 2^64 (lsb first) 
        uint8  buffer[64];  // input buffer                            
      } md5_ctx;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ситуация такая

 

Во время выполнения программы (номинальная загрузка стека ОЗУ 10% свободно 90%) вызывается некоторая процедура пусть П1. В процедуре П1 объявляется typedef struct, которая съедает стек ОЗУ на 90% контроллера (так было задуманно), выполняется нужные действия, данные выводятся, и осуществляется выход с процедуры П1.

 

Такой вопрос а как поступит компилятор IAR с ОЗУ когда выйдет с процедуры П1, вернёт обратно стек к 10%, или стуктура останится висеть в ОЗУ контроллера и останится свободно 100-90=10% ОЗУ ???

 

IAR AVR.4.21

Это вопрос не к IAR, а ответ K&R, на форуме ссылок достаточно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

меня больше всего интересуют эти массивы

 

uint32 state[4];    // state (ABCD)                           
         uint32 count[2];    // number of bits, modulo 2^64 (lsb first) 
         uint8  buffer[64];  // input buffer

 

они пропадут когда я выйду с процедуры которая вызывала

md5_ctx md5_struct;  //md5 object

???

Изменено пользователем west329_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если они в стеке - да, см мой пост выше... Что непонятно-то? :)

И что значит ваша фраза "процедура, которая вызывала md5_ctx md5_struct; //md5 object" ???

 

Кстати, присоединяюсь к VladimirYU - может быть стоит почитать книжку по С? ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если они в стеке - да, см мой пост выше... Что непонятно-то? :)

И что значит ваша фраза "процедура, которая вызывала md5_ctx md5_struct; //md5 object" ???

 

Кстати, присоединяюсь к VladimirYU - может быть стоит почитать книжку по С? ;)

Всё иду читать С :)

 

П.С.

добавте только в название разделя "для тех кто почитал С"

Изменено пользователем west329_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С этого в любом случае стоит начать. Книжка не толстая, зато многие вопросы исчезнут. А если останутся - по крайней мере сможете внятно их задать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ситуация такая

...

west329_, может Вы имели ввиду не стек, а как компилятор в процедуре локально (временно) разместит большую переменную-структуру? И освободит ли он эту память после выхода из неё?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

west329_, может Вы имели ввиду не стек, а как компилятор в процедуре локально (временно) разместит большую переменную-структуру? И освободит ли он эту память после выхода из неё?

 

Да.

Меня смущают предупреждения IAR по достижению заполнения стека на 90%, а когда выхожу с процедуры предупреждения не пропадают, и продолжают выводится как будто стек полон ?

Изменено пользователем west329_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

west329_, может Вы имели ввиду не стек, а как компилятор в процедуре локально (временно) разместит большую переменную-структуру? И освободит ли он эту память после выхода из неё?

 

А разве компилятор локально (временно) размещает объекты где-то еще помимо стека???

 

Меня смущают предупреждения IAR по достижению заполнения стека на 90%, а когда выхожу с процедуры предупреждения не пропадают, и продолжают выводится как будто стек полон ?

 

А указатель стека как при этом меняется? Чему он равен до входа в процедуру и чему после?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А разве компилятор локально (временно) размещает объекты где-то еще помимо стека???

А указатель стека как при этом меняется? Чему он равен до входа в процедуру и чему после?

 

Вы все правильно говорите.

 

Я вобще симулятором ИАР не часто пользуюсь.

 

Стек по ходу программы высвобождается как я понял из окна Stack/CStack по зелёной линии, хотя предупреждения выводятся.

post-30423-1222840174_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На этой картинке вы еще из функции не вышли... После выхода тоже выводятся ворнинги?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На этой картинке вы еще из функции не вышли... После выхода тоже выводятся ворнинги?

Да, это меня и засмущало, но зелёная линия пригнула влево до упора, что как я понял свидетельствует об очистке стека, но не факт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

зелёная линия пригнула влево до упора, что как я понял свидетельствует об очистке стека, но не факт.

 

Ну так посмотрите на значения регистров SP и Y ... Первый отвечает за стек возвратов, а второй - за стек данных. Координаты вершин стеков можно увидеть в map-файле.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...