|
|
  |
ищу исходники intrinsic-функций IAR EW430, __bic_SR_register и __bic_SR_register_on_exit |
|
|
|
Jul 3 2008, 20:55
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Мое мнение: на то они и intrinsic, что их результирующий код генерится компилятором в процессе работы и может различаться в зависимости от остального кода. Поэтому исходника их нет. Может быть исходник для какого-то конкретного случая, когда функцию встраивать нецелесообразно. Например memcpy для пересылки одного-нескольких байт с известными на этапе компиляции адресами будет заменен на несколько mov, а для большего количества или в случае параметров-переменных будет вставлен вызов библитечной реализации. Ваши функции требуют в качестве параметра адрес сохраненного на стеке SR, который знает компилятор в процессе генерации кода (и, если я правильно помню, вырождаются в одну команду, операнды которой компилятор подставляет на лету) или доступа к самому SR, что на голом С невозможно, а асмовые вставки у ИАРа хромают. К тому же эти команды могут изменить флаги условий, которые компилятор может ожидать от предыдущих команд. При генерации intrinsic - реализации компилятор может оценить влияние передаваемого вами параметра на эти флаги. Могу ошибаться.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 4 2008, 07:47
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(sensor_ua @ Jul 4 2008, 10:11)  __bic_SR_register() делается с тупым запрещением/разрешением прерываний или через сохранение статуса Как вы себе это представляете? GIE живет в этом же регистре SR. Если я понимаю правильно, то __bic_SR_register(x) компилится в (к сожалению, проверить сейчас не на чем): Код bic #x, SR;если х - константа
mov &val, Rx bic Rx, SR; если х - переменная. Где тут запрещать прерывания? Цитата(sensor_ua @ Jul 4 2008, 10:11)  , ну а __bic_SR_register_on_exit() просто не трогает GIE или как, "встраивается" в эпилог и её нужно использовать перед самым выходом или может вызываться в любом месте обработчика прерывания, или просто в любой критической секции (при уже запрещённых прерываниях) А разве она встраивается не в точку использования? В точке использования компилятор знает, сколько байтов он положил на стек в процессе выполнения обработчика. Например, 4. Тогда __bic_SR_register_on_exit(х) выливается в bic #x, 4(SP). При выходе из прерывания на исполнении RETI это "подправленное" значение будет загружено в SR. Тут тоже запрещать прерывания негде.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 4 2008, 08:17
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Где тут запрещать прерывания? Я надеюсь что так, но сомнения есть. А так как нет исходников, то сомнения остаются, потому как даже если один раз оно будет скомпилировано так, как Вы написали, то второй раз (так как может рулить сам компилятор) это может быть не так. Цитата В точке использования компилятор знает Спасибо, это похоже оно и врятли можно сделать иначе
--------------------
aka Vit
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|