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

2019-07-21 05:17发布

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

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

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

能看懂的童鞋,恭喜你,C语言水平很不错! PLC摘取核心源码.zip (2.66 MB, 下载次数: 293) 2018-5-2 17:04 上传 点击文件名下载附件
PLC摘取核心源码



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
xo37
2019-07-21 10:14
一共两个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]

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

一周热门 更多>