花了几分钟时间,通过lua c api实现了几个api函数让lua调用,感觉lua和c的交互调用确实极其方便。
- int main(){
- .....
- Sys_TimerInit();
- SerialPort_Init();
- IWDG_Configuration();
- WWDG_Configuration();
- __set_PRIMASK(0);
-
- Sys_TimerRequest(OTimerID7,50,1);
- // 这是main里面的调用lua
-
- L = lua_open();
- luaopen_base(L);
- //注_册自己的c函数到lua中
- lua_register(L, "average", average);
- lua_register(L, "Lsleep", Lsleep);
- lua_register(L, "Lmyputs0", Lmyputs0);
-
- InitTasks();
- AddTask(facetask,1);
- AddTask(uart0task,1);
-
- float a,c2;
- char buf[100];
- //这里是lua脚本, 脚本里面又调用了自己定义得c函数, Lmyputs0---串口输出函数 average --平均值函数, Lsleep--延时函数
- strcpy(buf," Lmyputs0("start!",6); c2=2; a1 = {"one","two","three"} a=average(10, 20, 30, 40, 50); count=0; while 1>0 do \r\n count=count+1; Lmyputs0(a1[(count%3)+1],6); Lsleep(300); \r\n end; \r\n Lmyputs0("end!",4)");
-
- //让lua运行脚本!
- luaL_dostring(L, buf);
- ...
- }
- //下面是几定义的函数
- static int average(lua_State *L)
- {
- /* 得到参数个数 */
- int n = lua_gettop(L);
- double sum = 0;
- int i;
- /* 循环求参数之和 */
- for (i = 1; i <= n; i++)
- {
- /* 求和 */
- sum += lua_tonumber(L, i);
- }
- /* 压入平均值 */
- lua_pushnumber(L, sum / n);
- /* 压入和 */
- lua_pushnumber(L, sum);
- /* 返回返回值的个数 */
- return 2;
- }
- static int Lsleep(lua_State *L){
- int d;
- PT_Timer_t tmr0;
-
- d=lua_tonumber(L, 1);
- PT_TimerSet(&tmr0,d);
- while(PT_TimerExpired(&tmr0)==false){
- WDT_FLAG = 0;
- RunTaskList();
- }
- lua_pushnumber(L, 1);
- return 1;
- }
-
- static int Lmyputs0(lua_State *L)
- {
- char *buf;
- int len;
- buf=(char *)lua_tostring(L,1);
- len=lua_tonumber(L, 2);
- myputs0(buf,len);
-
- lua_pushnumber(L, 1);
- return 1;
- }
|