Есть ядро arm1176jzf-s внутри s3c6410.
Суть проблемы: групповой pop отрабатывает неверно. Выяснилось, когда начал разбираться почему после вызова функции портится локальный указатель. Оказалось неверно восстанавливается из стека.
При этом
Код
push {r0, r1, r2, r3, r4, r5}
pop {r0, r1, r2, r3, r4, r5}
Работает на ура. А вот:
Код
push {r4, r5, r6, r7, r10, lr}
pop {r4, r5, r6, r7, r10, pc}
Уже не работает как надо. Делаем push {r4, r5, r6, r7, r10, lr}:
Код
r4 0x57f7a000 1475846144
r5 0x57e77f70 1474789232
r6 0x57f7a000 1475846144
r7 0x2 2
...
r10 0x57039a10 1459853840
...
lr 0x570001a8 1459618216
pc 0x570001b4 0x570001b4 <clbss_l+36>
После pop {r4, r5, r6, r7, r10, pc}:
Код
r4 0x57f7a000 1475846144
r5 0x57e77f70 1474789232
r6 0x57039a10 1459853840
r7 0x570001a8 1459618216
...
r10 0x57f7a000 1475846144
...
lr 0x570001a8 1459618216
pc 0x570001a8 0x570001a8 <clbss_l+24>
Порча стека исключена - иструкции идут друг за другом, прерывания выключены.
Стэк после push (после pop остается прежним):
Код
0x57e77f28: 0x57f7a000 0x57e77f70 0x57f7a000 0x00000002
0x57e77f38: 0x57039a10 0x570001a8 0xffffffff 0xffffffff
0x57e77f48: 0x57f7a000 0x57e77f70
Что я забыл? Где посмотреть? Память проинициализирована верно, вроде как. Приложение до падения успевает отработать много кода с интенсивными обращениями к памяти.