2012-03-15 1 views
0

Я пытаюсь интегрировать Lua во встроенный проект с использованием GCC на Cortex-M4. Я могу загрузить и запустить сценарий Lua, вызывая функции Lua из C, вызывая функции C из Lua. но программа C вылетает (ловушка HardFault_Handler поднимается), когда данный скрипт, переданный как параметр в luaL_dostring(), содержит любые синтаксические ошибки Lua.luaL_dostring() сбой, если данный скрипт имеет синтаксическую ошибку

здесь соответствующий код C, который выходит из строя из-за синтаксической ошибки в Lua:

 //create Lua VM... 
     luaVm = lua_newstate(luaAlloc, NULL); 

     //load libraries... 
     luaopen_base(luaVm); 
     luaopen_math(luaVm); 
     luaopen_table(luaVm); 
     luaopen_string(luaVm); 

     //launch script... 
     luaL_dostring(luaVm, "function onTick()\n" 
          " locaal x = 7\n" //syntax error 
          "end\n" 
          "\n"); 

когда делает то же самое с правильным синтаксисом Lua, то он работает:

luaL_dostring(luaVm, "function onTick()\n" 
         " local x = 7\n" 
         "end\n" 
         "\n"); 

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

Может ли кто-нибудь помочь? Благодарю.


отключили setjmp/longjmp в Lua исходном коде следующим образом:

//#define LUAI_THROW(L,c) longjmp((c)->b, 1) //TODO oli4 orig 
//#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } //TODO oli4 orig 

#define LUAI_THROW(L,c) while(1) //TODO oli4 special 
#define LUAI_TRY(L,c,a) { a } //TODO oli4 special 

... так нет setjmp/longjmp используется больше, но я до сих пор аварии :-(

должен иметь другую причину ???

+0

Поддерживает ли ваша платформа 'longjmp'? Сбой этой программы при запуске: «ошибка» «стрела»? – lhf

+0

платформа STM32F4 микроэлектроники ST. он, похоже, поддерживает longjmp (скажем: он компилируется при использовании этих функций). но на самом деле Lua падает при запуске ошибки «foo». так что кажется, что longjmp работает неправильно? – oli4

+0

Мне кажется, что «longjmp» - это первое, на что нужно обратить внимание. – lhf

ответ

1

нашел проблему: это функция sprintf, вызванная синтаксической ошибкой Lua. Фактически, на моей платформе sprintf, похоже, не поддерживает функцию с плавающей запятой п. поэтому я изменил luaconf.h следующим образом, ограничивая представление целым форматом.

//#define LUA_NUMBER_FMT  "%.14g" 
#define LUA_NUMBER_FMT  "%d" 
+0

Вы должны принять свой собственный ответ. – lhf

0

должен иметь другую причину ???

Да: вы не можете использовать Lua здесь.

Система обработки ошибок Lua построена на основе setjmp/longjump. Вы не можете просто сделать LUAI_THROW и LUAI_TRY do ничего. Это означает, что lua_error и вся внутренняя обработка ошибок перестает работать. Синтаксические ошибки являются частью внутренней обработки ошибок Lua.

Если ваш компилятор C не обеспечивает надлежащую поддержку стандартной библиотеки C, Lua просто не будет функционировать в этой среде. Вы можете попробовать LuaJIT, но я сомневаюсь, что это будет лучше.

+0

Согласен. Не было целью отключить обработку ошибок Lua. У меня был отключен только временной режим, чтобы изолировать причину ошибки. – oli4