OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7646|回复: 10

基于STM32的最精练的PLC解释器核心算法源代码

[复制链接]

2

主题

2

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2018-4-25
在线时间
2 小时
发表于 2018-5-2 17:05:23 | 显示全部楼层 |阅读模式
1金钱
最精练的基于STM32的PLC解释器核心算法源代码!!!

不仅可用于可编程解释执行的内核代码,也可以用于IC设计的IP核开发、操作系统开发,或者其它对执行效率要求很高的场合!

能看懂不?绝对可以让您终生受益无穷!

能看懂的童鞋,恭喜你,C语言水平很不错! PLC摘取核心源码.zip (2.66 MB, 下载次数: 1803)

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-5-2 17:05:24 | 显示全部楼层
回复

使用道具 举报

0

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2019-1-12
在线时间
65 小时
发表于 2019-2-14 19:07:13 | 显示全部楼层
一共两个C文件:
a.c:
[mw_shl_code=c,true]void trig_proc(void)
{
        u32 tmp1, tmp2, tmp;
        u32 i;

        for (i=0; i<X_MAP_SIZE; i+=4)
        {
                tmp1 = *(__IO u32 *)(i+X_MAP_START);
                tmp2 = *(__IO u32 *)(i+X_BAK_START);
                tmp = (tmp1^tmp2);
                *(__IO u32 *)(i+XP_MAP_START) = (tmp&tmp1);
                *(__IO u32 *)(i+XF_MAP_START) = (tmp&tmp2);
        }
        memcpy((void *)X_BAK_START, (void *)X_MAP_START, X_MAP_SIZE);

        for (i=0; i<Y_MAP_SIZE; i+=4)
        {
                tmp1 = *(__IO u32 *)(i+Y_MAP_START);
                tmp2 = *(__IO u32 *)(i+Y_BAK_START);
                tmp = (tmp1^tmp2);
                *(__IO u32 *)(i+YP_MAP_START) = (tmp&tmp1);
                *(__IO u32 *)(i+YF_MAP_START) = (tmp&tmp2);
        }
        memcpy((void *)Y_BAK_START, (void *)Y_MAP_START, Y_MAP_SIZE);

        for (i=0; i<M_MAP_SIZE; i+=4)
        {
                tmp1 = (*(__IO u32 *)(i+M_MAP_START));
                tmp2 = (*(__IO u32 *)(i+M_BAK_START));
                tmp = (tmp1^tmp2);
                *(__IO u32 *)(i+MP_MAP_START) = (tmp&tmp1);
                *(__IO u32 *)(i+MF_MAP_START) = (tmp&tmp2);
        }
        memcpy((void *)M_BAK_START, (void *)M_MAP_START, M_MAP_SIZE);

}
[/mw_shl_code]

b.c:
[mw_shl_code=c,true]void instruct_exe(void)
{
        u32 a1, a2;
        u16 wTmp;
        u16 n;
        u32 i;

        if (!(IS_HAVE_PRG_FLAG))
                return;

        a1 = PLC_PRG_ADDR_START + sizeof(T_PlcPrgHead) + 16;
        a2 = a1 + __pPlcPrgHead->len;
        START();
        for (i=a1; i<a2; i+=8)
        {
                wTmp = *(u16 *)(i);
                n = (wTmp>>12)&0x0f;
                wTmp &= 0x03ff;
                PAR_FLAG = *(u16 *)(i+2);
                if (wTmp >= __BaseInstCodeStart && wTmp <= _BaseInstCodeEnd)
//                if (n < 2)
                {
                        _pBaseInstTbl[wTmp](*(u32 *)(i+4));
                }
                else if (wTmp >= _2InstCodeStart && wTmp <= _2CellInstCodeEnd)// if (n < 4)
                {
                        _p2CellInstTbl[wTmp-_2InstCodeStart](*(u32 *)(i+4), *(u32 *)(i+8), *(u32 *)(i+12));
                        i += 8;
                }
                else if (wTmp >= _3InstCodeStart && wTmp <= _3InstCodeEnd)//if (n < 6)
                {
                        _p3CellInstTbl[wTmp-_2InstCodeStart](*(u32 *)(i+4), *(u32 *)(i+8), *(u32 *)(i+12), *(u32 *)(i+16), *(u32 *)(i+20));
                        i += 16;
                }
                       
        }
        END();
}
[/mw_shl_code]

其余是广告,请叫我雷锋……
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-7-18
在线时间
3 小时
发表于 2019-8-30 14:59:52 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2019-12-7
在线时间
27 小时
发表于 2019-12-7 14:15:33 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2019-12-7
在线时间
27 小时
发表于 2019-12-7 15:34:16 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2019-12-7
在线时间
27 小时
发表于 2020-1-14 08:08:42 | 显示全部楼层
谢谢分享谢谢分享
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2018-3-13
在线时间
16 小时
发表于 2020-11-28 13:43:23 | 显示全部楼层
谢谢分享
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-8-26
在线时间
9 小时
发表于 2020-12-10 21:25:01 | 显示全部楼层
学习一下。
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1436
金钱
1436
注册时间
2020-5-12
在线时间
394 小时
发表于 2020-12-11 12:38:39 | 显示全部楼层
曾经看不懂,现在一看就懂
回复

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2019-7-1
在线时间
43 小时
发表于 2020-12-23 14:33:53 | 显示全部楼层
叶子君 发表于 2020-12-11 12:38
曾经看不懂,现在一看就懂

tmp = (tmp1^tmp2);  
        *(__IO u32 *)(i+XP_MAP_START) = (tmp&tmp1); 这是为了得到什么呢? 请大神讲解一下
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 07:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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