jcxz 184 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 19 часов назад, xvr сказал: Вангую продолжение темы - "как сохранить структуру с указателями в FLASH'е" Это ещё что. Встречал "погромистов" которые данные с указателями передавали по связному интерфейсу другому девайсу! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 4 hours ago, jenya7 said: Да. Я таки собираюсь сохранить структуру с указателями в FLASH. а что тут не так? Всё Я так понял, что вы пытаетесь откомпилить какой то скрипт и засунуть результат в FLASH? Если да, то кончайте маятся дурью с структурами и указателями и смотрите в сторону интерпретаторов и байт-кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 2 минуты назад, jenya7 сказал: я создам переменную по определенному адресу #define RAM_START 0x20000000 #define STAK_SIZE 0x2000 uint32_t my_var @RAM_START+STAK_SIZE+20; А если в новой версии вдруг приспичит изменить размер этого самого "STAK"-а? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 1 hour ago, jcxz said: А если в новой версии вдруг приспичит изменить размер этого самого "STAK"-а? тогда ручками меняем циферку в дефайне. не так сложно. 1 hour ago, xvr said: Всё Я так понял, что вы пытаетесь откомпилить какой то скрипт и засунуть результат в FLASH? Если да, то кончайте маятся дурью с структурами и указателями и смотрите в сторону интерпретаторов и байт-кода. смотрел. не нашел нормальной реализации. есть что то конкретное у вас? работающее? проверенное? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 1 минуту назад, jenya7 сказал: тогда ручками меняем циферку в дефайне. не так сложно. Ничего сложного. Если только эта структура с данными не должна сохраняться после обновления прошивки. Т.е. - если это не конфигурационные данные прибора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 2 minutes ago, jenya7 said: смотрел. не нашел нормальной реализации. есть что то конкретное у вас? работающее? проверенное? Есть. Делал несколько разных штук под конкретные задачи. Все очень маленькие и простые. Можете исходную задачу озвучить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 мая, 2019 Опубликовано 14 мая, 2019 (изменено) · Жалоба 1 hour ago, xvr said: Есть. Делал несколько разных штук под конкретные задачи. Все очень маленькие и простые. Можете исходную задачу озвучить? нужно парсить простые скрипты. вот пример самого сложного Quote IF DIR=2 AND POS0>POS1 AND POS0-POS1>20 THEN PWM0-=100 AND PWM1+=100 это одна строка. таких строк будет 10-20 я сделал вариант. вроде работает. проблема что он занимает очень много места в распарсеном варианте, после лексера. такое выражение занимает 228 байт. на страницу поместица только 8. Изменено 14 мая, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 55 минут назад, jenya7 сказал: тогда ручками меняем циферку в дефайне. не так сложно. И куда будеn указывать считанный из EEPROM указатель от предыдущей прошивки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 мая, 2019 Опубликовано 14 мая, 2019 (изменено) · Жалоба 1 hour ago, Сергей Борщ said: И куда будеn указывать считанный из EEPROM указатель от предыдущей прошивки? в смысле? переменная всегда находиться по тому же адресу uint32_t my_var @0x20004000; ааа. в смысле если сдвинуть стак? перегружаем скрипт. Изменено 14 мая, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 1 hour ago, jenya7 said: это одна строка. таких строк будет 10-20 Ваш скрипт IF DIR=2 AND POS0>POS1 AND POS0-POS1>20 THEN PWM0-=100 AND PWM1+=100 в байткоде будет чем то таким (привожу в псевдо ассемблере) ReadVar DIR Const 2 EQ JmpF label1 ReadVar POS0 ReadVar POS1 GT JmpF label1 ReadVar POS0 ReadVar POS1 Sub Const 20 GT JmpF label1 ReadVar PWM0 Const 100 Sub SetVar PWM0 ReadVar PWM1 Const 100 Add SetVar PWM1 label1: End Где то около 40 байт Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 1 hour ago, xvr said: Ваш скрипт IF DIR=2 AND POS0>POS1 AND POS0-POS1>20 THEN PWM0-=100 AND PWM1+=100 в байткоде будет чем то таким (привожу в псевдо ассемблере) ReadVar DIR Const 2 EQ JmpF label1 ReadVar POS0 ReadVar POS1 GT JmpF label1 ReadVar POS0 ReadVar POS1 Sub Const 20 GT JmpF label1 ReadVar PWM0 Const 100 Sub SetVar PWM0 ReadVar PWM1 Const 100 Add SetVar PWM1 label1: End Где то около 40 байт О! Это уже ближе к телу! А у вас есть движок? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 10 minutes ago, jenya7 said: О! Это уже ближе к телу! А у вас есть движок? Движок рисуется под вашу платформу. Он будет небольшой - сотня друга строк Я могу попробовать раскопать свой, но он вам без доработки напильником явно не подойдёт Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 мая, 2019 Опубликовано 14 мая, 2019 (изменено) · Жалоба 1 hour ago, xvr said: Движок рисуется под вашу платформу. Он будет небольшой - сотня друга строк Я могу попробовать раскопать свой, но он вам без доработки напильником явно не подойдёт было бы здорово. лексер у меня в принципе есть. мне непонятна кухня после лексера. как я перевожу в байт код и как потом команды бегут. Изменено 14 мая, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 21 minutes ago, jenya7 said: лексер у меня в принципе есть. мне непонятна кухня после лексера Лексера недостаточно. Ещё синтаксическая часть нужна. 22 minutes ago, jenya7 said: как потом команды бегут А вот это уже очень просто. Читается последовательно опкод, декодируется (большим switch'ем), исполняется. И так по кругу Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба Нашёл один свой движок, но вам он похоже не поможет - слишком полнофункциональный :( (И большой) Вот пример того, что ему можно дать на вход: #pragma CharSet cp1251 void error(int i) {WWW_BShowInit(); WWW_String("<HTML><TITLE>Error</TITLE><BODY>\n"); WWW_String(printf("<H1><CENTER> Error (#%d) %s</CENTER></H1>",i,DBA_Error(i))); WWW_String("<A href=\""+WWW_RefNext()+"\">Ok</A></BODY></HTML>"); WWW_Show(); } export void main_script() {string result=""; int rarr=ArrayI_New(); for(;;) {WWW_BShowInit(); WWW_String("<HTML><TITLE>ClassTree test</TITLE><BODY>\n"); WWW_String("<script>\n"); WWW_String("function my_callback(val)\n"); WWW_String("{document.forms[0].inp.value=val;}\n"); WWW_String("</script>\n"); WWW_String("<FORM ACTION=\""+WWW_RefNext()+"\">\n"); if (result!="") WWW_String("Class ID: "+result+"<br>\n"); if (rarr.Array_Length()) {WWW_String("<hr>Result array:<br>\n"); for(int i=0;i<rarr.Array_Length();++i) WWW_String(printf("#%08X ",rarr.ArrayI_Get(i))); WWW_String("<hr>"); rarr.Array_Reduce(0);} WWW_String("Enter ClassTree id: <input type=text name=inp>"); WWW_String(" <input type=button value='Select a Class Tree'\n"); WWW_String(" onclick='open(\"/$ClassTreeSelect/my_callback?Sel=fSU\",\"ClassTreeSel\",\"directories=0,location=0,menubar=0,status=0,toolbar=0\")'><br>\n"); WWW_String("Enter TovarType id: <input type=text name=tinp><br>\n"); WWW_String("<input type=submit name=ok value='Ok'>\n"); WWW_String("</FORM></BODY></HTML>\n"); WWW_Show(); string v=WWW_GetField("inp"); if (v=="") break; int cls=DBA_ClassFind(v); result=printf("#%08X",cls); if (cls!=-1) {int rv=DBA_TypeBase(rarr,cls,WWW_GetField("tinp"),2); if (rv<0) error(rv);} } Array_Del(rarr); } export void tshow_test() { for(;;) { WWW_TShowInit("tst"); WWW_AddField("Fld",WWW_GetField("var")); WWW_Show(); if (WWW_GetField("act")=="quit") break; } } export void tovar_test() { int pars = ArrayS_New(); int rexp_types = ArrayI_New(); rexp_types.ArrayI_Put(0,-1); int out = ArrayI_New(); WWW_BShowInit(); WWW_String("<HTML><BODY>\n"); WWW_String("<FORM ACTION=\""+WWW_RefNext()+"\">\n"); WWW_String("P1: <input type=text name=p1><br>\n"); WWW_String("P2: <input type=text name=p2><br>\n"); WWW_String("P3: <input type=text name=p3><br>\n"); WWW_String("P4: <input type=text name=p4><br>\n"); WWW_String("P5: <input type=text name=p5><br>\n"); WWW_String("<input type=submit name=ok value='Ok'>\n"); WWW_String("</FORM></BODY></HTML>"); WWW_Show(); pars.ArrayS_Put(0,WWW_GetField("p1")); pars.ArrayS_Put(1,WWW_GetField("p2")); pars.ArrayS_Put(2,WWW_GetField("p3")); pars.ArrayS_Put(3,WWW_GetField("p4")); pars.ArrayS_Put(4,WWW_GetField("p5")); int cnt=DBA_Tovar(2,pars,rexp_types,out); WWW_BShowInit(); WWW_String("<HTML><BODY>\n"); WWW_String(printf("Ret %d<br>\n",cnt)); WWW_String("Results:<br>\n"); for(int i=0;i<out.Array_Length();++i) WWW_String(printf("%d ",out.ArrayI_Get(i))); WWW_String("<HR><A HREF=\""+WWW_RefNext()+"\">Again</A></HTML>"); WWW_Show(); Array_Del(pars); Array_Del(rexp_types); Array_Del(out); } (Он встраивался в WEB сервер) Вот выхлоп (в виде листинга) первой функции: error: - Options: 0000 - Total params: 1 - String locals: 0 - Total locals: 0 - String param. scale: 00000000 - Max stack size: 2*4 000C: call ext 0002 000F: str <HTML><TITLE>Error</TITLE><BODY> 0032: call ext 0005 0035: str <H1><CENTER> Error (#%d) %s</CENTER></H1> 0060: var int param[0] 0063: var int param[0] 0066: call ext 0018 0069: int 3 006E: int 5 0073: call ext 0000 0076: call ext 0005 0079: str <A href=" 0084: call ext 000B 0087: + (str) 0088: str ">Ok</A></BODY></HTML> 00A0: + (str) 00A1: call ext 0005 00A4: call ext 0006 00A7: return main_script: - Options: 0000 - Total params: 0 - String locals: 2 - Total locals: 5 - String param. scale: 00000000 - Max stack size: 2*4 00B4: str 00B6: = (str) [0] 00B9: call ext 000C 00BC: = [2] 00BF: call ext 0002 00C2: str <HTML><TITLE>ClassTree test</TITLE><BODY> 00EE: call ext 0005 00F1: str <FORM ACTION=" 0101: call ext 000B 0104: + (str) 0105: str "> 010A: + (str) 010B: call ext 0005 010E: var str [0] 0111: str 0113: != (str) 0114: cgoto >011A 0117: goto >0135 011A: str Class ID: 0126: var str [0] 0129: + (str) 012A: str <br> 0131: + (str) 0132: call ext 0005 0135: var int [2] 0138: call ext 0012 013B: cgoto >0141 013E: goto >01B5 0141: str <hr>Result array:<br> 0159: call ext 0005 015C: int 0 0161: = [3] 0164: goto >0194 0167: str #%08X 016F: var int [2] 0172: var int [3] 0175: call ext 000D 0178: int 2 017D: int 1 0182: call ext 0000 0185: call ext 0005 0188: var int [3] 018B: int 1 0190: + 0191: = [3] 0194: var int [3] 0197: var int [2] 019A: call ext 0012 019D: < 019E: cgoto >0167 01A1: str <hr> 01A7: call ext 0005 01AA: var int [2] 01AD: int 0 01B2: call ext 0013 01B5: str Enter ClassTree id: <input type=text name=inp><br> 01EB: call ext 0005 01EE: str Enter TovarType id: <input type=text name=tinp><br> 0225: call ext 0005 0228: str <input type=submit name=ok value='Ok'> 0251: call ext 0005 0254: str </FORM></BODY></HTML> 026B: call ext 0005 026E: call ext 0006 0271: str inp 0276: call ext 0008 0279: = [1] 027C: var str [1] 027F: str 0281: == (str) 0282: cgoto >02EF 0285: goto >028B 0288: goto >02EF 028B: var str [1] 028E: call ext 0015 0291: = [3] 0294: str #%08X 029B: var int [3] 029E: int 2 02A3: int 1 02A8: call ext 0000 02AB: = [0] 02AE: var int [3] 02B1: int -1 02B6: != 02B7: cgoto >02BD 02BA: goto >00BF 02BD: var int [2] 02C0: var int [3] 02C3: str tinp 02C9: call ext 0008 02CC: int 2 02D1: call ext 0016 02D4: = [4] 02D7: var int [4] 02DA: int 0 02DF: < 02E0: cgoto >02E6 02E3: goto >00BF 02E6: var int [4] 02E9: call 0000 02EC: goto >00BF 02EF: return Давайте лучше ваш случай рассмотрим. Что может быть в условии IF и в его теле? Все IF'ы выполняются последовательно или до первого сработавшего? Где выполняется трансляция программы (в МК или на хосте)? Куда записывается результат? (В FLASH, внешний DataFLASH или ещё куда)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться