Jump to content

    

Передача константного значения в указатель.

19 часов назад, xvr сказал:

Вангую продолжение темы - "как сохранить структуру с указателями в FLASH'е"

:suicide2:

Это ещё что. Встречал "погромистов" которые данные с указателями передавали по связному интерфейсу другому девайсу! :biggrin:

Share this post


Link to post
Share on other sites
4 hours ago, jenya7 said:

Да. Я таки собираюсь сохранить структуру с указателями в FLASH. а что тут не так?

Всё :crazy:

 

Я так понял, что вы пытаетесь откомпилить какой то скрипт и засунуть результат в FLASH? Если да, то кончайте маятся дурью с структурами и указателями и смотрите в сторону интерпретаторов и байт-кода.

Share this post


Link to post
Share on other sites
2 минуты назад, jenya7 сказал:

я создам переменную по определенному адресу


#define RAM_START 0x20000000
#define STAK_SIZE 0x2000

uint32_t my_var @RAM_START+STAK_SIZE+20;

 

А если в новой версии вдруг приспичит изменить размер этого самого "STAK"-а?  :russian_ru:

Share this post


Link to post
Share on other sites
1 hour ago, jcxz said:

А если в новой версии вдруг приспичит изменить размер этого самого "STAK"-а?  :russian_ru:

тогда ручками меняем циферку в дефайне. не так сложно.

1 hour ago, xvr said:

Всё :crazy:

 

Я так понял, что вы пытаетесь откомпилить какой то скрипт и засунуть результат в FLASH? Если да, то кончайте маятся дурью с структурами и указателями и смотрите в сторону интерпретаторов и байт-кода.

смотрел. не нашел нормальной реализации. есть что то конкретное у вас? работающее? проверенное?

Share this post


Link to post
Share on other sites
1 минуту назад, jenya7 сказал:

тогда ручками меняем циферку в дефайне. не так сложно.

Ничего сложного. Если только эта структура с данными не должна сохраняться после обновления прошивки. Т.е. - если это не конфигурационные данные прибора.

Share this post


Link to post
Share on other sites
2 minutes ago, jenya7 said:

смотрел. не нашел нормальной реализации. есть что то конкретное у вас? работающее? проверенное?

Есть. Делал несколько разных штук под конкретные задачи. Все очень маленькие и простые. Можете исходную задачу озвучить?

Share this post


Link to post
Share on other sites
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.

Edited by jenya7

Share this post


Link to post
Share on other sites
55 минут назад, jenya7 сказал:

тогда ручками меняем циферку в дефайне. не так сложно.

И куда будеn указывать считанный из EEPROM указатель от предыдущей прошивки?

Share this post


Link to post
Share on other sites
1 hour ago, Сергей Борщ said:

И куда будеn указывать считанный из EEPROM указатель от предыдущей прошивки?

в смысле? переменная всегда находиться по тому же адресу  uint32_t my_var @0x20004000;

ааа. в смысле если сдвинуть стак? перегружаем скрипт.

Edited by jenya7

Share this post


Link to post
Share on other sites
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 байт

 

Share this post


Link to post
Share on other sites
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 байт

 

О! Это уже ближе к телу! А у вас есть движок?

Share this post


Link to post
Share on other sites
10 minutes ago, jenya7 said:

О! Это уже ближе к телу! А у вас есть движок?

Движок рисуется под вашу платформу. Он будет небольшой - сотня друга строк

Я могу попробовать раскопать свой, но он вам без доработки напильником явно не подойдёт

 

Share this post


Link to post
Share on other sites
1 hour ago, xvr said:

Движок рисуется под вашу платформу. Он будет небольшой - сотня друга строк

Я могу попробовать раскопать свой, но он вам без доработки напильником явно не подойдёт

 

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

Edited by jenya7

Share this post


Link to post
Share on other sites
21 minutes ago, jenya7 said:

лексер у меня в принципе есть. мне непонятна кухня после лексера

Лексера недостаточно. Ещё синтаксическая часть нужна.

22 minutes ago, jenya7 said:

как потом команды бегут

А вот это уже очень просто. Читается последовательно опкод, декодируется (большим switch'ем), исполняется. И так по кругу

Share this post


Link to post
Share on other sites

Нашёл один свой движок, но вам он похоже не поможет - слишком полнофункциональный :( (И большой)

 

Вот пример того, что ему можно дать на вход:

#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 или ещё куда)?

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now