Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » О программе BASCOM AVR/8051 » Обнаруженые ошибки компилятора.


Обнаруженые ошибки компилятора.

Сообщений 61 страница 82 из 82

61

таким образом, прерывание, использующее Y-pointer, должно и будет портить и любую другую функцию. особенно функции, определенные пользователем, с переменными параметрами передаваемыми через стек.
Вывод: необходимо сохранять все, что используешь в прерывании и, естественно, при необходимости и Y-регистр. а версия компилятора тут не причем.

0

62

1 вы не делаете всех необходимых установок в программе и полагаетесь на значения, устанавливаемыми по умолчанию где-то в меню, а потом жалуйтесь. параметры умолчания как раз и отличаются в разных версиях. параметры умолчания также сохраняются в конфигурации от предыдущих проектов! серьезных или труднопреодолимых глюков в компиляторе НЕТ уже лет десять! с версии 1170.
2 какие еще функции вы предлагаете вызывать, запретив прерывания? это предложение абсурдно!
3 и прекратите пользоваться всякими протеусами это совершенно непродуктивно и не профессионально. не тратьте на это время. Все нужно представлять в голове и проверять в железе. А программы писать просто и надежно.

-1

63

возможно есть баг с перечислением этих настроек через двоеточие, а с нулями - это критический момент видимо, Марк не предполагал, что так делать будут :D
вообще ему надо было свойства проекта не выводить текстом, точнее хранить всё в том же файле бейсика, но эти настройки не отображать как текст, а выводить их в отдельное свойство проекта, причем идею можно развить дальше, скажем добавить туда в зависимости от типа МК конфигурацию ножек под типы задач, чтобы была небольшая стандартизация по названиям констант в проекте/программе

0

64

Mrshilov написал(а):

Попробуйте поставить нули на странице настроек, увидите, что получится.

Поставил.
Компилятор переварил и выдал прошивку.

0

65

Mrshilov написал(а):

Больше о найденных ошибках писать не буду.

Это будет, категорически не правильно!
Кому не нравится пусть не читает!
Не обращайте внимания!

Поиск ошибок не самоцель, а средство улучшения программы!

Отредактировано sasha_1973 (2013-08-01 02:04:12)

+1

66

Mrshilovу
1 Не пробовал ассемблерные команды писать через двоеточие? Не компилит? Это тоже ошибка?
2 А в примере полезно было бы определить размер строки S.

0

67

1 записывается, например, "s as string * 10". 10 означает, что в программный стек будет записано десять байт (символов), а затем четыре байта для следующих переменных (типа byte), определенных в прототипе твоей функции. Если размер не указать, то записанные данные не попадают по назначению (попадают не по назначению). Не получив значение размера строки компилятор справедливо может полагать, что ее длина равна 0 или 255 с одинаковыми последствиями
2 использование локальных переменных в Bascom совершенно не оправдано, так как он не располагает их в регистрах общего назначения как многие компиляторы СИ. В результате имеем:
- неоптимальный дополнительный код из-за загрузки-разгрузки стека, необходимости дополнительной подготовки данных для операторов языка, как правило рассчитанных обработку статических переменных;
- трудновылавливаемые ошибки, а следовательно затраты времени на отладку и проверку;
- сокращении места под переменные?, но происходит равнозначное увеличение размера программного стека;
- рискованный стиль программирования (заработает или нет или вдруг произойдет недопустимое сочетания операторов?). 
из плюсов - только возможность применения, вроде бы, более простой формы записи исходного текста - круто и крупно-квадратно.

0

68

dmm написал(а):

использование локальных переменных в Bascom совершенно не оправдано, так как он не располагает их в регистрах общего назначения

И что в этом хорошего? Можно забыть про рекурсию и вызов функции из кода и прерывания. И как вы думаете что произойдет если вызывать функции из функции (с учетом что номера регистров статически связаны с локальными переменными)?
В ЯП для компа, обычно локальные переменные хранятся в стеке.

0

69

Сколько просматривал код "C"  в AVR Studio не заметил чтобы они сильно
использовали регистры общего назначения. В основном X,Y,Z, R24, R25 и иногда
ещё пару тройку и всё. Все переменные в ОЗУ.
И кто мешает делать вставки на ASM в критичных местах и писать нормальный код,
чтоб потом без головной боли.

0

70

dmm написал(а):

1 записывается, например, "s as string * 10". 10 означает, что в программный стек будет записано десять байт (символов),

Просто в памяти для этой переменной будет зарезервировано 10 байт, а использовать можете хоть 1.

0

71

На самом деле, при назначении переменой string значения 10 в реале резервируется 11 байт, т.к. +1 байт это всегда 0 (конец строки).

0

72

всегда надо точно или с запасом описывать переменные, часто из-за этого не только портятся данные, но и ядро из прерывания может не вернуться или произвольно прыгать в стартовую точку кода..

0

73

если написать Lcdtext "Строка 1", то архитектура кода будет выглядеть так: код выводит данные по определенному алгоритму из флеша МК (память программы, т.е. "Строка 1" будет храниться/прошивать вместе с HEXом)
если это будет функция "Sub Lcdtext(byval S As String....", то здесь речь идет уже о динамических данных, S - это область в SRAM МК и всё, что гоняется через неё требует места, если не контролировать значение этой переменной, то чревато последствиями (память переполнится), да эта переменная не задается прямым образом, как в этом случае компилятор формирует область ОЗУ - не разбирался (мне это и не нужно), для этого головные настройки и нужны (по этой причине я не использую функции, т.к. процесс полностью идет не контролируемый мной, что там компилятор и как распихает - темный лес (и так проблем хватает, зачем ещё усложнять))

0

74

где я написал, что согласен с ним? я вообще "о своём".

0

75

1 bascom-омском хелпе предлагается обязательно указывать размер строки передаваемой переменной.
2 что там залеплено у марка с передачей параметров функциям даже не разбирался. после пары неприятностей - вообще перестал ими пользоваться. и не жалею.
3 нормальном СИ все очень строго:
   - сколько байт загрузил в программный стек при вызове функции - столько внутри функции и извлеки. иначе он разбалансируется
   - в коде загрузка выглядит приблизительно так так
     LDI R24, "С"
     ST Y+,R24
     LDI R24, "т"
     ST Y+,R24
     LDI R24, "р"
     ST Y+,R24
     LDI R24, "о"
     ST Y+,R24
     LDI R24, "к"
     ST Y+,R24
     LDI R24,"а"
     ST Y+,R24
     LDI R24, " "
     ST Y+,R24
     LDI R24, "1"
     ST Y+,R24
     LDI R24, 0
     ST Y+,R24
     LDI R24, 0
     ST Y+,R24
   - в коде выгрузка выглядит так
     LDI XL, Low(S)
     LDI XH , High(S)
     LD R24,Y-
     ST X+,R24
     LD R24,Y-
     ST X+,R24
     LD R24,Y-
     ST X+,R24
     LD R24,Y-
     ST X+,R24
     LD R24,Y-
     ST X+,R24
     LD R24,Y-
     ST X+,R24
     LD R24,Y-
     ST X+,R24
     LD R24,Y-
     ST X+,R24
- десять записал затем десять считал. ошибиться с количеством байт нельзя. иначе последующие переменные будут повреждены. и это независимо от реальной длины строковой переменной. компилятор должен знать сколько передается и ему необходимо об этом сообщить;
- в bascom иначе быть не должно (и не может). отсылки на то, что все равно работает или не работает несерьезны!
- выгрузка параметров из функции даже в СИ реализуется по разному. иногда через служебные переменные. поэтому обычно используется только стандартные возможности. В bascom здесь вообще темный лес с оврагом
- чтобы действительно эффективно использовать механизм функций необходимо отчетливо представлять как он реализуется

0

76

странный код какой-то, у вас лицензия?
или это так работает вывод именно "Lcdtext"?
у меня всё содержимое "print" в коде выглядят одним цельным словом (в самом конце ХЕКса) через разделитель нуля)

0

77

так это выглядит в командах ассемблера

0

78

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

Отредактировано Пётр (2013-08-02 18:44:54)

0

79

1 Когда после компиляции обнаруживается не тот результат, что ожидался, то есть только два выхода: исправить программу или переписать компилятор под собственные «залепухи». Второй вариант, очевидно, не самый реальный. Значит нужно писать в программе так, чтобы получался необходимый результат.

2 Mrshilovу!  Да, я не знаю, как помочь человеку, который залез головой вперед в узкое глухое отверстие. Нужно сдать назад и поискать другой путь, без «заморочек». Для твоей программы нужно просто все переменные сделать обычными, глобальными.

0

80

Mrshilov, я смотрю вы последнее время агрессивно настроены. Тема была для обсуждения проблем и их решений (большинство очевидных), а не писямеринья... Порой даже писать ничего не хочется, т.к. не знаешь когда там огребешь/что-то не понравится "гуру".

Да, Марк сделал невнятный компилятор, который генерит порой глупый код, но альтернативы сейчас (увы) - нет. И это пока лучший движок для "лентяев" (ближайший "конкурент" mikroBasic PRO - это даже не бейсик, какой-то гибрид всех языков и легкое веяние самого бейсика, хотя и с мощной поддержкой производителя, с кучей библиотек и шикарнейшей IDE).

Если не объявленные переменные вас вгоняют в ступор, то есть два варианта (которые описали люди выше):

1. самому в коде иметь такой алгоритм, который никогда не превысит значения указанные в системных настройках ($hwstack, $swstack, $framesize);
2. не использовать вообще динамические переменные/массивы.

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

0

81

мужики, заканчиваем
иначе Василий влепит всем по бану и я умою руки...:(

0

82

Нашел еще глюк в версии 2.0.7.3
Пишу программу с буферированным вводом по RS232 Config Serialin = Buffered , Size = 8. Команда очистки буфера CLEAR SERIALIN дает ошибку.
В ранних версиях и версии 2.0.7.6 все работает.  o.O

0

Похожие темы


Вы здесь » Программирование ATMEL в BASCOM. » О программе BASCOM AVR/8051 » Обнаруженые ошибки компилятора.