通过报文对嵌入式进行编程举例

这是对我之前《如何假装用C语言为嵌入式写一个新语言》进行一个举例,以便更好地理解这种编程方式。 报头(S)报尾(E) 控制指令 程序逻辑指令 举例 报头(S)报尾(E) 报头和报尾 ASCII BUGUS 42 55 47 55 53 BUGUE 42 55 47 55 45 CODES 43 4f 44 45 53 CODEE 43 4f 44 45 45 VORCS 56 4f 52 43 53 VORCE 56 4f 52 43 45 CONSTS 43 4f 4e 53 54 53 CONSTE 43 4f 4e 53 54 45 RVARS 52 56 41 52 53 RVARE 52 56 41 52 45 SAVES 53 41 56 45 53 SAVEE 53 41 56 45 45 WVARS 57 56 41 52 53 WVARE 57 56 41 52 45 控制指令 指令内容 指令标号(用户不可见) 参数1 参数2 输入输出选择(基础IO模块) 0x02 引脚选择(暂时0x01-0x0a) 输入0输出1 输出高低选择(基础IO模块) 0x03 引脚选择(暂时0x01-0x0a) 低电平0高电平1 毫秒级延时(时序模块) 0x04 延时时间(暂时0x01-0xff) 程序逻辑指令 指令内容 指令标号 信息1 信息2 信息3 信息4 信息5 信息6 循环启动器(程序基础控制模块) 0x01 CODE返回位 VORC返回位 CONST返回位 RVAR返回位 SAVE返回位 WVAR返回位 举例 加入用户输入了这样一个程序: ...

December 1, 2020 · 云雾海

如何假装用C语言为嵌入式写一个新语言

我们在使用无线嵌入式器件的时候,或多或少对于AT指令都有所了解——通过通信口发送一串字符,以AT开头,换行符结尾,中间插入指令内容,就可以实现对芯片寄存器的配置。这种指令式配置类似于蓝牙、WiFi等设备可能比较简单,但是如果我们打算用它去实现一个比较复杂的编程呢?是否也可以通过这种方式,是否可以在不使用编译器的情况下,通过指令调取内部程序并执行?我将会通过一个小demo进行测试这种编程方式的可行性。 本文的程序可以在这里下载 使用工具 工作流程 指令程序设计 功能映射并单指令运行 多指令运行 上位机编程 传递参数 返回值 思路解析 参数 返回值 变量和常量 输入判断 输出判断 报文 总结和反思 使用工具 Code::Blocks, C语言 工作流程 整个系统的工作流程比较简单,如下图所示: graph LR Send[报文发送端] --通信--> ReCV subgraph 单片机 ReCV[报文接收端]-->Mem[存储] Mem-->Read[读取指令] Read--函数和参数-->Work[完成操作] Work--返回值-->Mem end 这里的报文内容其实来自于上位机对下位机内部已有程序的映射,例如我在单片机中已经设置好了一个函数void Exp(),那么我们就可以在上位机制作一个模块,使用者如果调取了这个模块那么上位机就会自动将该模块对应的指令值插入到报文中,假设这里是0x05,那么下位机如果在报文中检测到了0x05,就会自动执行Exp()函数。 当然详细内容会更复杂,我们现在只是有了一个基本概念,还需要继续完善内容。 指令程序设计 如果我们需要实现指令编程,那么内部肯定不止有Exp()一个程序,先不考虑指针传参的情况,我们根据参数和返回值的不同情况可以将函数分为以下几种情况: 无参数无返回值 无参数有返回值 有参数无返回值 有参数有返回值 而实际上参数的个数不定,我们暂时先不考虑不定参数的情况,可以分为: 单个参数 多个参数 而实际上多个参数的情况可以包含单个参数,那么我们就在这个demo中设置如下几种情况。 无参数无返回值函数 无参数有返回值函数 两个参数无返回值函数 三个参数有返回值函数 为此,我设计了如下几个函数: /* * 全局变量声明 */ int static flag = 0; /* * 函数声明和定义 */ void SayHello() // 打印一行Hello World! { printf("Hello World!\n"); } int NowFlag() // 将flag值自增一然后打印出来并返回 { flag++; printf("flag = %d\n", flag); return flag; } void ShowSum(int a, int b) // 打印两个参数之和 { printf("%d + %d = %d\n", a, b, a+b); } int GetSum(int a, int b, int c) // 打印并返回三参数之和 { int sum = a + b + c; printf("%d + %d + %d = %d\n",a, b, c, sum); return sum; } 现在我们在main中测试调用他们并运行一下: ...

November 24, 2020 · 云雾海