花了几分钟时间,通过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;
}
|