硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2838|回复: 6
收起左侧

V6 LUA-RL-Flash+SD和C互调

[复制链接]

36

主题

149

回帖

262

积分

高级会员

积分
262
发表于 2019-9-4 13:58:27 | 显示全部楼层 |阅读模式
说明:lua文件放在外部储存器(例如SD卡)才有项目意义,方便有户修改LUA代码,本次移植RL-FLASHFS。LUA精华是可以和其它语言(如C语言)相互调用起胶水作用
步骤:
1.修改luaconf.h,在其中增加宏定义#define LUA_32BITS;
2.重新实现print函数的底层,Lua的print函数的C语言实现部分是lbaselib.c文件的luaB_print()函数,修改lauxlib.h中宏定义lua_writestring,lua_writeline
/* print a string */
#if !defined(lua_writestring)
#define lua_writestring(s,l)   printf(s)//fwrite((s), sizeof(char), (l), stdout)
#endif

/* print a newline and flush the output */
#if !defined(lua_writeline)
#define lua_writeline()        printf("\n")//(lua_writestring("\n", 1), fflush(stdout))
#endif
3.移植RL-FLASHFS的SD卡文件系统
1)定义getc函数
int getc(FILE *stream)
{
        char ch = 0;
        int res;

        res = fread(&ch, 1, 1,  stream);
        if(!res)
        {
                return EOF;
        }
               
        return ch;
}
2)修改luaconf.h默认路径
#define LUA_PATH_DEFAULT  "M0:\\?.lua;"
#define LUA_CPATH_DEFAULT "M0:\\?.so;"
4.LUA调用C函数必须按LUA格式重新封装并注册
1)格式typedef int (*lua_CFunction) (lua_State *L);
2)封装
static int lua_led_on(lua_State *L)
{
        bsp_LedOn(1);
        return 1;
}
static int lua_led_off(lua_State *L)
{
        bsp_LedOff(1);
        return 1;
}

static int lua_delay(lua_State *L)
{
        int num;
        num= lua_tointeger(L, 1);
        bsp_DelayMS(num);
        return 1;
}

static const struct luaL_Reg mylib[]=
{
        {"led_on",lua_led_on},
        {"led_off",lua_led_off},
        {"delay",lua_delay},
        {NULL,NULL}
};
3)注册luaL_setfuncs(L, mylib, 0);
5.C调用LUA函数
  lua_getglobal(L, "ledrun"); //LuaoˉêyÃû       
  if (lua_pcall(L, 0, 0, 0) != 0) //ÔËDDoˉêy
{
        lua_tostring(L, -1);
}
6.LUA源码led.lua
function ledrun()
        n = 1
        while (n < 20)
        do
                led_on()
                delay(500)
                print("led ok")
                led_off()
                delay(500)
                n = n + 1
        end
end
7.C源码
int main(void)
{
        lua_State *L;

        bsp_Init();                /* ó2&#188;t3&#245;ê&#188;&#187;ˉ */


        L = luaL_newstate(); /* &#189;¨á¢Lua&#212;&#203;DD&#187;·&#190;3 */
        luaopen_base(L);
//        luaL_openlibs(L);
        luaL_setfuncs(L, mylib, 0);


        while (1)
        {
                luaL_dostring(L, "print(\"Hello,I am lua!\\n--this is newline printf\")\n");


                if (luaL_dofile(L, "M0:\\led.lua"))//&#188;ó&#212;&#216;&#206;&#196;&#188;t
                {
                        lua_tostring(L, -1);
                }

                lua_getglobal(L, "ledrun"); //Luaoˉêy&#195;&#251;       
                if (lua_pcall(L, 0, 0, 0) != 0) //&#212;&#203;DDoˉêy
                {
                   lua_tostring(L, -1);
                }
               
                lua_close(L);


                while (1);
        }
}







V6 LUA-RL-Flash+SD.zip

2.35 MB, 下载次数: 113

评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 赞一个!

查看全部评分

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2019-9-4 15:00:37 | 显示全部楼层
非常感谢楼主分享
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2019-9-21 10:07:28 | 显示全部楼层
楼主测试过可以跑多少行lua吗?
回复

使用道具 举报

36

主题

149

回帖

262

积分

高级会员

积分
262
 楼主| 发表于 2019-9-21 11:52:10 | 显示全部楼层
飞行少年 发表于 2019-9-21 10:07
楼主测试过可以跑多少行lua吗?

可以,完全没问题
回复

使用道具 举报

36

主题

149

回帖

262

积分

高级会员

积分
262
 楼主| 发表于 2019-9-21 11:56:05 | 显示全部楼层
飞行少年 发表于 2019-9-21 10:07
楼主测试过可以跑多少行lua吗?

多少行是内存的问题
回复

使用道具 举报

10

主题

19

回帖

49

积分

初级会员

积分
49
发表于 2020-7-30 16:47:41 | 显示全部楼层
takent 发表于 2019-9-21 11:56
多少行是内存的问题

请问下这个工程 fopen,fread可以使用吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2020-7-30 17:05:21 | 显示全部楼层
nextstation 发表于 2020-7-30 16:47
请问下这个工程 fopen,fread可以使用吗

lua + FatFS,实现lua调用其他lua文件,需要重载c库文件操作函数
http://www.armbbs.cn/forum.php?m ... 7441&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-10 22:48 , Processed in 0.285967 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表