ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
11 июня
1591001 Топик полностью
klen (Сегодня, 01:36, просмотров: 31)
удалось портануть lua 5.5.x из транка в ch32v307. Родя Иерусалимский был бы гением если стал бы писать свою нетленку НЕ-на-С.... но не гений. 

портируем все внешние зависимости в свои локальные ( аллокатор памяти, файловый io и gettime и прочая мура перехватывается и реализуется ручками, newlib идет в жеппу. )

нахрен под корень выпиливается все что связано с уобищем под названием "printf/sprinf/fprintf/..... " Родя похоже решил в коде все варианты IO говна вставить- b POSIX API и не POSIX, гдето даже Масдайную чудесатость встретил, тогда как можно было бы обойтись по одной функцией на базовый тип и сделать тонкий иниерфейс... поздно. макароны так хорошо перепутались что распутывать себе дороже.


однако ж собралось и с такой то матерью заработало.


экспериет выглядел так.


в main() создаем Lua стейт , пихаем в него строку в которой реализуется фцнкция решения квадратного уравнения, и вызов этой функции с праметрами.


после отработки строки , сворачиваем Lua стейт взад.

на всех стадиях смотрим сотояние кучи которая прикручена к Lua и сотояние основного стека.


void *port_luaL_alloc (void *ud, void *ptr, size_t osize, size_t nsize)
{
  (void)(ud); (void)(osize);
  if (nsize == 0) {
	  o1heap_mmgr::o1heap1.dealloc(ptr);
    return NULL;
  }
  else
    return o1heap_mmgr::o1heap1.realloc(ptr, nsize);
}



// KGP: move to external user-appliction level int main (int argc, char **argv) { #if 0 int status, result; lua_State *L = luaL_newstate(port_luaL_alloc); /* create state */ if (L == NULL) { l_message(argv[0], "cannot create state: not enough memory"); return EXIT_FAILURE; } lua_gc(L, LUA_GCSTOP); /* stop GC while building state */ lua_pushcfunction(L, &pmain2); /* to call 'pmain' in protected mode */ lua_pushinteger(L, argc); /* 1st argument */ lua_pushlightuserdata(L, argv); /* 2nd argument */ status = lua_pcall(L, 2, 1, 0); /* do the call */ result = lua_toboolean(L, -1); /* get result */ report(L, status); lua_close(L); return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE; #endif int status, result; lua_State *L ; if ( !(L = luaL_newstate(f)) ) { l_message(argv[0], "cannot create state: not enough memory"); return EXIT_FAILURE; } lua_gc(L, LUA_GCSTOP); /* stop GC while building state */ // // lua_pushcfunction(L, &pmain); /* to call 'pmain' in protected mode */ // lua_pushinteger(L, argc); /* 1st argument */ // lua_pushlightuserdata(L, argv); /* 2nd argument */ // // // status = lua_pcall(L, 2, 1, 0); /* do the call */ luai_openlibs(L); /* open standard libraries */ lua_gc(L, LUA_GCRESTART); /* start GC... */ lua_gc(L, LUA_GCGEN); /* ...in generational mode */ char func[] = "local function solveQuadratic(a, b, c) \ local delta = (b^2) - (4 * a * c) \ print(delta) \ \ if delta < 0 then \ return \"No real roots\" \ elseif delta == 0 then \ local root = -b / (2 * a) \ return root \ else \ local sqrt_delta = math.sqrt(delta) \ local root1 = (-b + sqrt_delta) / (2 * a) \ local root2 = (-b - sqrt_delta) / (2 * a) \ return root1, root2 \ end \ end \ print(solveQuadratic(1, -5, 5)) "; if (luaL_dostring(L, func ) != LUA_OK) { const char *err = lua_tostring(L, -1); fputs(err,0); } char task[] = "v=1051.36 print(v/10000)" ; if (luaL_dostring(L, task ) != LUA_OK) { const char *err = lua_tostring(L, -1); fputs(err,0); } result = lua_toboolean(L, -1); /* get result */ report(L, status); lua_close(L); return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE; }





получили - после разворачивания L - 2к озу из кучи, на момент работы с строкой 18к после окончания Lua честно все вернуло до байта взад в кучу.

общее использования основного стека как видно из скриншота - около 3кБ




как видно Lua при обработке строки решая урвнение 288 раза тыкалась в кучу, максимальный запрос блока был до 1Кб.

как то так...

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

фактически - пихать в нее программку на lua-коде и динамически программировать. слово такое похабное есть - скриптование.


скорость наверно не будеть фантастичесской ибо это ж интерпретаор строки... но в больших машинах где нужно таоке и очень быстрое - отказываются от питона и преходят на Lua. очень широко используется в компьтерных играх.