реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Программная запись FLASH AT91SAM7S128
defunct
сообщение Apr 1 2009, 21:29
Сообщение #31


кекс
******

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



Цитата(aaarrr @ Apr 1 2009, 23:51) *
Можно написать эту процедуру на асме, тем самым гарантировав ее переносимость, и спокойно копировать в ОЗУ.

Или наоборот непереносимость, т.к. ситаксис ассемблера может отличаться.

Да и вы начинаете сами себе противоречить.
то
Цитата
Для данного конкретного случая вполне очевидный результат.

то
Цитата
Но нельзя переносить результат работы компилятора. Даже когда все кажется очевидным и безопасным.

Проще надо быть. Когда пишешь безопасный код, то и компилятор сделает все безопасно на выходе.
Поэтому нет нужды тратить свое время на рожание асм кода, компилятор - сгенерирует тоже самое быстрее и дешевле.
Есть сомнения, загляните в листинг. Не работает - исправьте.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 1 2009, 21:44
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Apr 2 2009, 01:29) *
Или наоборот непереносимость, т.к. ситаксис ассемблера может отличаться.

Переносимость не в смысле "возможность компиляции тулзом X" (что я вообще не считаю проблемой), а в смысле "возможность работы из любого адреса".

Цитата(defunct @ Apr 2 2009, 01:29) *
Проще надо быть. Когда пишешь безопасный код, то и компилятор сделает все безопасно на выходе.

Вы не можете заранее знать, безопасно ли менять рабочий адрес процедуры. Если она, конечно, не состоит из шести команд (целых 24 байта ОЗУ сэкономили!) как в данном случае.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 1 2009, 22:08
Сообщение #33


кекс
******

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



Цитата(aaarrr @ Apr 2 2009, 00:44) *
Переносимость не в смысле "возможность компиляции тулзом X" (что я вообще не считаю проблемой), а в смысле "возможность работы из любого адреса".

Ок, хорошо, с такой точки зрения согласен.
Но переносимость всмысле "возможность компиляции тулзом X" теряется. Хоть это и не проблема - но это время, наше время!
Зачем самое дорогое что есть, тратить на адаптацию кода к тулзу X?

Цитата
Вы не можете заранее знать, безопасно ли менять рабочий адрес процедуры.

Если она не содержит вызовов других функций, и не использует глобальных переменных, можно спокойно прогнозировать ее поведение при выполнении с любого адреса.
(т.е. важно чтобы функция всего навсего не содержала в себе адресацию через PC).
Как достичь - передать ей все требуемые данные в качестве параметров.

Цитата
Если она, конечно, не состоит из шести команд (целых 24 байта ОЗУ сэкономили!) как в данном случае.

smile.gif тем не менее 24 байта сэкономлено.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 1 2009, 22:39
Сообщение #34


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Apr 2 2009, 02:08) *
Зачем самое дорогое что есть, тратить на адаптацию кода к тулзу X?

Можно вместо асма машинным кодом забить - будет на 100% переносимо. Отличный вариант, кстати.

Цитата(defunct @ Apr 2 2009, 02:08) *
Если она не содержит вызовов других функций, и не использует глобальных переменных, ...

...и не использует "сложных" констант.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 1 2009, 22:55
Сообщение #35


кекс
******

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



Цитата(aaarrr @ Apr 2 2009, 01:39) *
Можно вместо асма машинным кодом забить - будет на 100% переносимо. Отличный вариант, кстати.

Бесспорно отличный вариант как для себя, но плохо читаемо если выкладывать...

Цитата
...и не использует "сложных" констант.

Да, и их тоже, разумеется.

Надеюсь вы согласитесь, что непосредственно код примера - безопасен.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 1 2009, 23:35
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Получается нечто вроде:
Код
void fcmd(U32 fcr)
{
    U32 ramcmd[6] =
    {
        0xe3a01000, // MOV      r1,#0
        0xe501009c, // STR      r0,[r1,#-0x9c]; MC_FCR
        0xe5110098, // LDR      r0,[r1,#-0x98]; MC_FSR
        0xe3100001, // TST      r0,#1
        0x0afffffc, // BEQ      {pc} - 0x8
        0xe12fff1e  // BX       r14
    };
    void (*pcmd)(U32) = *(void (*)(U32))&ramcmd;

    pcmd(fcr);
}


Вполне работоспособно и переносимо. Но я бы все же предпочел вариант с линкером.

Цитата(defunct @ Apr 2 2009, 02:55) *
Надеюсь вы согласитесь, что непосредственно код примера - безопасен.

О да, вполне. Просто кто-нибудь мог экстраполировать результат на другой код и поиметь проблем.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 23:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01417 секунд с 7
ELECTRONIX ©2004-2016