|
как в winavr сделать так чтоб в прерывании вместо push/pop было st/ld, ... |
|
|
|
May 20 2008, 07:06
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 11-03-08
Пользователь №: 35 811

|
есть проблема с компилятором WinAVR-20071221 в прерываниях он ставит push/pop, в результате стека не хватает, хочу заменить на st/ld, кто знает как это зделать, перейти на iar нет возможности.
|
|
|
|
|
 |
Ответов
|
May 20 2008, 08:08
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Kibi @ May 20 2008, 11:06)  есть проблема с компилятором WinAVR-20071221 в прерываниях он ставит push/pop, в результате стека не хватает, хочу заменить на st/ld, кто знает как это зделать, перейти на iar нет возможности. Прямо, никак... Обходными путями можно, только весь контекст придется ручками сохранять, типа: Код void TIMER2_COMP_vect(void) __attribute__((signal)) __attribute__((naked)); void TIMER2_COMP_vect() { {сохраняем контекст}
{восстанавливаем контекст} __asm__ __volatile__("reti"); // выходим } Только вот непонятен до конца вопрос, как использование st/ld поможет сократить размер необходимой памяти ?
|
|
|
|
|
May 20 2008, 09:50
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 11-03-08
Пользователь №: 35 811

|
Цитата(singlskv @ May 20 2008, 12:08)  Прямо, никак... Обходными путями можно, только весь контекст придется ручками сохранять, типа: Код void TIMER2_COMP_vect(void) __attribute__((signal)) __attribute__((naked)); void TIMER2_COMP_vect() { {сохраняем контекст}
{восстанавливаем контекст} __asm__ __volatile__("reti"); // выходим } Только вот непонятен до конца вопрос, как использование st/ld поможет сократить размер необходимой памяти ? когда сохраняем регистры с помощью st они сохраняются не в стеке, а в памяти выделенной под временные переменные, а вот когда идет push то переменные сохраняются в стек, стек растет и перекрывает собой адресное пространство временных переменных, которые в свою очередь используются в прерывании, в результате стек слетает  чуть расширю вопрос, есть ли какие нибудь дериктивы чтоб локальные переменные ни при каких условиях не занимали область памяти стека???
|
|
|
|
|
May 20 2008, 10:29
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 11-03-08
Пользователь №: 35 811

|
Цитата(defunct @ May 20 2008, 14:04)  Вы заблуждаетесь. Временные (локальные) переменные располагаются также в стеке, а вот глобальные лежат по строго фиксированным адресам. Обращаться к стеку можно как с помощью PUSH/POP так и с помощью LD/ST. Судя по всему у Вас просто не хватает стека для нормальной работы программы. Менять PUSH/POP на LD/ST ничего не даст если памяти не хватает. Выход здесь такой - просто увеличить объем стека (сократить количество глобальных переменных, за счет замены их локальными переменными). нет, локальные распологаются не в области стека, проверял, проблема то возникает из-за небольшой рекурсии, но если push/pop заменить на st/ld, как было в iar, то все работает, но на iar вернуться нельзя, в том то и проблема, если кто знает директивы компилятору, чтоб push/pop заменить на st/ld то они мне впринципе и нужны, памяти используется 96%, но опятьже из-за небольшой рекурсии есть залезание в стек локальными переменными, к сожаленю логику программы переделывать мне месяц не дадут, сократить объем памяти тоже нет возможности:(
|
|
|
|
|
Aug 17 2008, 02:41
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Kibi @ May 20 2008, 13:29)  нет, локальные распологаются не в области стека, проверял, проблема то возникает из-за небольшой рекурсии, но если push/pop заменить на st/ld, как было в iar, то все работает, но на iar вернуться нельзя, в том то и проблема, если кто знает директивы компилятору, чтоб push/pop заменить на st/ld то они мне впринципе и нужны, памяти используется 96%, но опятьже из-за небольшой рекурсии есть залезание в стек локальными переменными, к сожаленю логику программы переделывать мне месяц не дадут, сократить объем памяти тоже нет возможности  Плохо проверяли. 1. Локальные переменные всегда располагаются в стеке если не помещаются в регистрах. 2. В IAR два стека, стек данных CSTACK, и стек возвратов RSTACK. И в IAR можно вручную задать их объем, т.о. память под стек заданного объема будет жестко резервирована и будет учитываться при подсчете занимаемой памяти. 3. В WinAVR есть один общий стек ничинающийся с RAMEND ничем не ограниченный снизу (память не резервируется и соответственно стек не учитывается при подсчете занятой памяти). Вы должны сами заботиться о том чтобы стека хватало. Если у вас используется 96% памяти, то значит под стек у вас осталось всего 4%. Умножте количество памяти вашего МК на 0.04 и будет вам число в байтах отведенное под стек в вашей программе. Учтите что для входа в прерывание нужно хотя бы 35 байт RAM + память на вызовы функций + память под локальные переменные. Меньше 256 байт стека, я считаю кощунством.
|
|
|
|
Сообщений в этой теме
Kibi как в winavr сделать так чтоб в прерывании вместо push/pop было st/ld May 20 2008, 07:06 Kuzmi4 Цитата(Kibi @ May 20 2008, 10:06) есть пр... May 20 2008, 07:49 MrYuran Цитата(Kibi @ May 20 2008, 10:06) есть пр... May 20 2008, 08:03  VladimirYU Цитата(Kibi @ May 20 2008, 13:50) когда с... May 20 2008, 10:01    Непомнящий Евгений Цитата(Kibi @ May 20 2008, 14:29) нет, ло... May 20 2008, 10:47     Qwertty Цитата(Непомнящий Евгений @ May 20 2008, 14... May 20 2008, 10:54     Kibi Цитата(Непомнящий Евгений @ May 20 2008, 14... May 20 2008, 10:59      aesok Цитата(Kibi @ May 20 2008, 14:59) просьба... May 20 2008, 11:04      Qwertty Цитата(Kibi @ May 20 2008, 14:59) если ес... May 20 2008, 11:33       VladimirYU Цитата(Qwertty @ May 20 2008, 15:33) Реше... May 20 2008, 11:47        galjoen Мне кажется, что первопричина тут в том, что один ... May 20 2008, 12:04        Непомнящий Евгений Цитата(VladimirYU @ May 20 2008, 15:47) Р... May 20 2008, 12:12       aesok Цитата(Qwertty @ May 20 2008, 15:33) Цита... May 20 2008, 15:57    777777 Цитата(Kibi @ May 20 2008, 14:29) нет, ло... May 20 2008, 10:53 VladimirYU Все дело IMHO в разных способах организации стека.... May 20 2008, 11:25 Kibi Цитата(VladimirYU @ May 20 2008, 15:25) В... May 20 2008, 11:44  singlskv Цитата(Kibi @ May 20 2008, 15:44) думаю ч... May 20 2008, 18:37 SasaVitebsk Совершенно согласен defunct. с Я бы добавил ещё сл... Aug 17 2008, 10:16 Qwertty Цитата(SasaVitebsk @ Aug 17 2008, 14:16) ... Aug 17 2008, 19:09  SasaVitebsk Цитата(Qwertty @ Aug 17 2008, 22:09) А че... Aug 18 2008, 00:28
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|