Cortex-M0 -- это архитектура ARMv6-M, имеющая только систему команд Thumb, а Cortex-M3 (как и -М4) -- это архитектура ARMv7-M, у которой используется Thumb-2. Последняя по своим функциональным возможностям почти соответствует "родной" АРМовской (которая у Cortex-M отсутствует вообще). В частности, любые операции могут выполняться с почти любыми регистрами, в то время как в Thumb свободно можно использовать лишь R0-R7, а остальные -- лишь в нескольких командах. Результат этого ограничения сильно зависит от компилятора. GCC, например, очень плохо следит за регистрами, из-за чего ему их всегда не хватает, и код прилично раздувается лишними сохранениями-восстановлениями в стеке, что приводит ещё и к тормозам (иногда -- очень приличным; у меня знакомый с этим столкнулся на LPC2478: при компиляции в код Thumb скорость падала в несколько раз по сравнению с кодом ARM, поскольку начинались сплошные обращения к стеку, который находился во внешней памяти вместе с видеобуфером -- ну, процессор и вынужден был стоять, когда к памяти обращался дисплейный контроллер; при коде ARM, в котором свободно использовались все регистры, число сохранений-восстановлений в стеке резко уменьшилось).
Реализация обработки прерываний одинакова, разница лишь количественная (большее число линий и т.п. у Cortex-M3). Правда, насколько помню, в ARMv7-M при возврате из прерывания выполняются дополнительные проверки, в то время как ARMv6-M игнорирует некоторые ошибки, из-за чего некий код, работающий на Cortex-M0, может оказаться неработоспособным на Cortex-M3 (другое дело, что этот код изначально является неправильным).
Сообщение отредактировал SII - Dec 10 2011, 08:52
|