Jump to content

    

jenya7

Участник
  • Content Count

    2153
  • Joined

  • Last visited

Everything posted by jenya7


  1. Програма падает в исключениу /* ** =================================================================== ** Method : Cpu_Cpu_Interrupt (component MK10FN1M0LQ12) ** ** Description : ** This ISR services an unused interrupt/exception vector. ** This method is internal. It is used by Processor Expert only. ** =================================================================== */ PE_ISR(Cpu_Interrupt) { /* This code can be changed using the CPU component property "Build Options / Unhandled int code" */ PE_DEBUGHALT(); } Как в KDS определить какая функция вызвала исключение? В IAR есть Call Stack окно в котором видна последняя функция. В KDS есть вкладка Debug и в ней я вижу. Это значит что исключение вызвал main()? Но в main() есть много функций. Как спуститься до причины проблемы? Я вообще не понимаю при чем здесь main(). В проекте включен FreeRTOS с одним таском. По идее main после инициализации передает управление шедулеру. Если я вылетел в исключение то из таска.
  2. В продолжение темы с уважаемым xvr. Мне нужно исполнять скрипт. Пользователь передает его в микроконтролер, скрипт сохраняется (в FLASH) и исполняется. в основном это проверка входных условий (переменных) и если условия выполнились - изменение выходных условий (переменных). Самоя сложное выражение (пока) это к примеру такое Выражений может быть до .... ну не знаю пока 40. в IF все AND - поэтому если хоть одно условие не выполниться THEN не исполняется. Для начала я сделал лексер после лексера я получаю token.name - "IF" token.type - If token.name - "DIR" token.type - Alphanumeric token.name - "=" token.type - Compare token.name - "2" token.type - Number token.name - "AND" token.type - Logic и так далее. вопрос - как двигаться дальше? могу показать свою версию, хотя она довольно уродливая.
  3. я думаю как в обычном С. если первое условие в AND не выполняется дальше не идем, выходим из выражения.
  4. а что значит vvvvv - индекс переменной (0-30) ?
  5. только эти. но выражение может быть более сложным VAR1=VAR2+VAR3
  6. кстати интересно и очень поучительно. но нужно переделывать под мои нужды. и я даже не представляю как.
  7. в принципе можно и AND обойтись. OR я могу сделать добавлением еще одного выражения вместо IF A1>B1 AND A1-B1>20 OR A2>B2 AND A2-B2>20 THEN C0-=100 AND C1+=100 можно записать IF A1>B1 AND A1-B1>20 THEN C0-=100 AND C1+=100 IF A2>B2 AND A2-B2>20 THEN C0-=100 AND C1+=100 а логические операции внутри арифметики - это как?
  8. в свое время я портировал Pawn в свой проект. но как то не пошло. может стоит вернуться, взглянуть еще раз. пример очень примитивный. он по сути не обращается к переменным напрямую.
  9. в IF из логики -AND и OR. из операторов + - * % > < >= <= == !=. не думаю что понадобиться что то еще. flex+bison? они не идут в виде готовых тулзов. или я не там смотрю?
  10. да конечно. почему бы не компилить скрипт на хосте. это наверное даже лучше.
  11. спасибо. посмотрю. я конечно не хочу все время гонять строковое выражение. это не оптимально по скорости. в моем варианте я ''расфасовываю'' его в структуру. проблема что структура получается очень большая.
  12. исправил. Ну скажем LWIP, FreeRTOS - легко портируется, куча примеров и документации. на таком уровне не нашел движка. все как то витают на абстрактном леере. и со списком этим я как то работал. там такие монстры. а мне надо что то заточенное под эмбедед. и еще замечание. все примеры скриптов которые я видел - это создание переменных и операции с ними. а мне нужно работать со своими переменными - данные в них я получаю от слейвов по CAN и мне нужно отслеживать эти данные и если нужно модифицировать данные и отсылать слейвам обратно.
  13. я копался но так и не нашел чего то удобоваримого ''из коробки''.
  14. Есть структура с указателями на переменные typedef struct { void *l_var; void *r_var; }IN_EXPR; IN_EXPR expression; Я ее инициализирую void * SCRIPT_ParseInVar(char * var) { uint32_t mot_num; if(strncmp(var,"pos",3)==0) { if (strlen(var) < 4) return 0; mot_num = atoi(&var[4]); if (mot_num > MAX_IDX) return 0; else return &motor_rt_params[mot_num].position; } return 0; } if (expression.l_var == NULL) expression.l_var = SCRIPT_ParseInVar(token); А если я хочу значение указателя инициализировать константой? То есть мне не важно на какой адрес будет указывать l_var главное чтоб значение было скажем 100 (*l_var = 100). Можно как то поизвращаться на этот счет?
  15. Ой. Я тогда новую тему открою. Очень объемно.
  16. было бы здорово. лексер у меня в принципе есть. мне непонятна кухня после лексера. как я перевожу в байт код и как потом команды бегут.
  17. О! Это уже ближе к телу! А у вас есть движок?
  18. в смысле? переменная всегда находиться по тому же адресу uint32_t my_var @0x20004000; ааа. в смысле если сдвинуть стак? перегружаем скрипт.
  19. нужно парсить простые скрипты. вот пример самого сложного это одна строка. таких строк будет 10-20 я сделал вариант. вроде работает. проблема что он занимает очень много места в распарсеном варианте, после лексера. такое выражение занимает 228 байт. на страницу поместица только 8.
  20. тогда ручками меняем циферку в дефайне. не так сложно. смотрел. не нашел нормальной реализации. есть что то конкретное у вас? работающее? проверенное?
  21. я создам переменную по определенному адресу #define RAM_START 0x20000000 #define STAK_SIZE 0x2000 uint32_t my_var @RAM_START+STAK_SIZE+20;
  22. Да. Я таки собираюсь сохранить структуру с указателями в FLASH. а что тут не так?
  23. Сделал такую проверку void *var_ptr; uint8_t test1; uint32_t test2; test1 = 5; var_ptr = &test1; test2 = *((uint32_t *)(var_ptr)); Получаю test2 = 5. Почему результат правильный? Я же привел не к тому типу?