Hi, All!
Понадобилось мне тут реинжиниринг своего старого устройства на PIC16C74 провести - несколько расширить функциональность. А писано оно на асме было. Решил, что быстрее его на С перепишу, чем с асемблером ковыряться, опять же - третье тысячелетие на дворе, человека пишущего на асме уже осмеивают. Взял HT-PIC, начитавшись в этой эхе славословий, какой это замечательный компилятор, и как здорово он код оптимизирует...
Но...В общем, не разделяю я теперь этого мнения. Оверхед оказался чудовищный. Например, очень характерная конструкция:
static bit Flag; char Counter; if(Flag) Counter++;
компилируется в следующее: btfss (_Flag/8),(_Flag)&7 goto u471 goto u470 u471 goto l93 u470 incf (((_Counter))) l93
Это вместо: btfsc (_Flag/8),(_Flag)&7 incf (((_Counter)))
5 слов вместо 2 возможных! 6 тактов вместо тех же 2! И не Бог весть какой сложный анализ для этого провести надо. То, что компилятор не догадывается, что если блок оператора if компилируется в одну команду, то goto не нужен, я еще где-то могу понять (хотя мог бы и догадаться, весьма распространенная ситуация). Но зачем ставить goto на еще один goto ?!Происходит это все на высшем уровне оптимизации (9), впрочем выше 5-6 уровня код уже практически не меняется, я разницы не заметил. Кроме того, не применяется повторное использование кода, не в пример тому же IAR C, который, увидев буквально 2-3 одинаковые команды в разных местах, оформляет их как подпрограмму. Понятно, что PIC не самый удобный процессор для С, и стек маленький, но ведь он все равно же дерево вызовов анализирует, и, там, где глубина стека позволяет (а таких мест хватает), мог бы ведь использовать...
В итоге, программа, которая на асме занимала чуть больше 3Кслов, теперь не лезет (или с трудом лезет) в 8К.
Да, версия - 8.01, может она неудачная какая в этом плане, какой версией народ пользуется? И попутно еще вопрос, я его тут уже задавал, но все проигнорировали -
- где бы доку на компилятор взять, соглашения о передаче параметров в функции, распределение памяти, и т.п? Какие слова знает инлайновый асемблер, и где они определены? Например, он слово status (в качестве имени регистра) проглатывает, а ccpr1l - нет, приходится адрес вручную указывать .
Примите уверения в совершеннейшем к Вам почтении