EDN首页   博客首页 用户登陆  |  注册
aaa
发表于 2009/2/20 21:46:24

0

关于投票

菜农的HotARM7农校今天正式成立

HotARM7 发表于 2009-2-20 21:30 裸奔式实时操作系统HotTask51 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: 菜农的HotARM7农校今天正式成立

建校原因:

    菜农对ARM7特别是对LPCARM的LPC213X/LPC214X系列有很深地研究和长期

应用。特别是头文件LPC213XDEF.H在网上有很深地影响和应用,

更可贵地是菜农建立的  非典型LPCARM之攻防体系对软件抗干扰做出了贡献。

   今天,菜农成功地完成了他20多年的梦想,在51单片机上成功地软中断,

中断隐身和51之攻防体系等一些列应用。

   今天,菜农为感谢从ARM7和TIDSP中获得的影响,特别在EDNChina建

立“HotARM7农校”,以示敬意。

菜农HotPower@126.com   2009.2.20 于雁塔菜地

 

LPC213XDEF

HotARM7 发表于 2009-2-20 21:38 裸奔式实时操作系统HotTask51 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

3楼: 《keil c51红杏出墙记》终于快要结尾了~~~

#include "interrupt.h"
/*---------------------------------------------
         外部中断0中断服务程序
----------------------------------------------*/
HotISR EInt0_ISR() HotTask_ISR(HOTISR_IE0_VECTOR, AR1)
{
    HotIsr_return(HOTISR_IE0_VECTOR);//中断隐身到后台处理
}


/*---------------------------------------------
         外部中断1中断服务程序
----------------------------------------------*/
HotISR EInt1_ISR() HotTask_ISR(HOTISR_IE1_VECTOR, AR1)
{
    HotIsr_return(HOTISR_IE1_VECTOR);//中断隐身到后台处理
}

/*------------------------------------------
         定时器T0中断服务程序
-------------------------------------------*/
HotISR Timer0_ISR() HotTask_ISR(HOTISR_TF0_VECTOR, AR1)
{
    HotIsr_return(HOTISR_TF0_VECTOR);//中断隐身到后台处理
}

/*------------------------------------------
         定时器T1中断服务程序
-------------------------------------------*/
HotISR Timer1_ISR() HotTask_ISR(HOTISR_TF1_VECTOR, AR1)
{
    HotIsr_return(HOTISR_TF1_VECTOR);//中断隐身到后台处理
}


/*----------------------------------------
         串口中断服务程序
-----------------------------------------*/
HotISR SIO_ISR() HotTask_ISR(HOTISR_SIO_VECTOR, AR1)
{
    HotIsr_return(HOTISR_SIO_VECTOR);//中断隐身到后台处理
}





#include "task.h"

/*---------------------------------------------
    HotTask51装载任务处理程序
----------------------------------------------*/
HotTASK TaskInit() HotTask_TASK(HOTTASK0_VECTOR, AR3)
{
HRESULT __result = S_FALSE;//失败
    __result = HotTaskCreate(HotTask_TaskId1,//任务1
                             Task1,//任务函数1
                             7//2级
                            );
    if (__result == S_OK)
    {
        __result = HotTaskCreate(HotTask_TaskId2,//任务2
                                 Task2,//任务函数2
                                 7//6级
                                );
        if (__result == S_OK)
        {
            __result = HotTaskCreate(HotTask_TaskId3,//任务3
                                     Task2,//任务函数2
                                     7//2级
                                    );
        }
    }
}


/*--------------------------------------------------------
    HotTask51任务Task1处理程序
---------------------------------------------------------*/
HotTASK Task1() HotTask_TASK(HOTTASK1_VECTOR, AR3)
{
    HotTask_while(HotTask_TaskId1)//HotTask51任务环格式
    {
        HotTaskWait(HotTask_TaskId1, 1);
    }
}

/*--------------------------------------------------------
    HotTask51任务Task2处理程序
---------------------------------------------------------*/
HotTASK Task2() HotTask_TASK(HOTTASK2_VECTOR, AR3)
{
    HotTask_while(HotTask_TaskId2)//HotTask51任务环格式
    {
    //
       HotTaskTickUnLock(HotTask_TaskId2);
    }
}

/*--------------------------------------------------------
    HotTask51任务Task3处理程序
---------------------------------------------------------*/
HotTASK Task3() HotTask_TASK(HOTTASK3_VECTOR, AR3)
{
    HotTask_while(HotTask_TaskId3)//HotTask51任务环格式
    {
        _nop_();
        _nop_();
        _nop_();
    }
}

/*--------------------------------------------------------
    HotTask51任务Task4处理程序
---------------------------------------------------------*/
HotTASK Task4() HotTask_TASK(HOTTASK4_VECTOR, AR3)
{
    HotTask_while(HotTask_TaskId4)//HotTask51任务环格式
    {
        _nop_();
        _nop_();
        _nop_();
    }
}

/*--------------------------------------------------------
    HotTask51任务Task5处理程序
---------------------------------------------------------*/
HotTASK Task5() HotTask_TASK(HOTTASK5_VECTOR, AR3)
{
    HotTask_while(HotTask_TaskId5)//HotTask51任务环格式
    {
    }
}

/*--------------------------------------------------------
    HotTask51任务Task6处理程序
---------------------------------------------------------*/
HotTASK Task6() HotTask_TASK(HOTTASK6_VECTOR, AR3)
{
    HotTask_while(HotTask_TaskId6)//HotTask51任务环格式
    {
        _nop_();
        _nop_();
        _nop_();
    }
}

/*--------------------------------------------------------
    HotTask51任务Task7处理程序
---------------------------------------------------------*/
HotTASK Task7() HotTask_TASK(HOTTASK7_VECTOR, AR3)
{
    HotTask_while(HotTask_TaskId7)//HotTask51任务环格式
    {
        _nop_();
        _nop_();
        _nop_();
    }
}


#include "event.h"
/*---------------------------------------------
         外部中断0事件处理程序
----------------------------------------------*/
HotEVENT EInt0_EVT() HotTask_EVT(HOTEVENT_IE0_VECTOR, AR0)
{
}
/*---------------------------------------------
         外部中断1事件处理程序
----------------------------------------------*/
HotEVENT EInt1_EVT() HotTask_EVT(HOTEVENT_IE1_VECTOR, AR0)
{
}
/*------------------------------------------
         定时器T0事件处理程序
-------------------------------------------*/
HotEVENT Timer0_EVT() HotTask_EVT(HOTEVENT_TF0_VECTOR, AR0)
{
}

/*------------------------------------------
         定时器T1事件处理程序
-------------------------------------------*/
HotEVENT Timer1_EVT() HotTask_EVT(HOTEVENT_TF1_VECTOR, AR0)
{
}


/*----------------------------------------
         串口事件处理程序
-----------------------------------------*/
HotEVENT SIO_EVT() HotTask_EVT(HOTEVENT_SIO_VECTOR, AR0)
{
}

 

keil c51红杏出墙记

系统分类: ARM  |  用户分类: 非典型LPCARM之攻防体系  |  标签: HotARM7农校成立  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(391) | 回复(0)

发表于 2007/1/30 23:56:26

0

关于投票

"中断就复位的概率高达50%"--与菜农判断一致,病症找到

http://bbs.21ic.com/club/bbs/ShowAnnounce.asp?v=&ID=2432748

hotpower 发表于 2007-1-30 23:42 ZLG-ARM ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

47楼: "中断就复位的概率高达50%"--与菜农判断一致,病症找到了,好解决

前面已说过http://www.ednchina.com/blog/hotpower/15390/message.aspx

丢中断有点伪中断的味道,这要从LPCARM的中断机制推起:

  当某个中断源被引发,IRQStatus或FIQStatus的某位将置'1',
VectAddrs[x]将被装入VectAddr,从而跳入
LDR     PC, [PC, #-0x0FF0];Vector from VicVectAddr
在此PC才将VectAddr装入后跳入VectAddr指出的地址,即散转了中断.
  假设VectAddrs[x]没被被装入到VectAddr中,且前次中断退出时执行
了VIC->VectAddr = 0x00;/* 通知VIC中断处理结束*/
那么本次的中断将会执行"软件复位",故中断肯定丢失.


所以我在实战中要避开VectAddrs[0],且以VectAddrs[0]为默认中断地址.
这样就可拦截非法中断了.当然其他不用的VectAddrs[x]我也指向默认中断地址.

假定该论证成立(我用软件仿真确实存在此隐患),那么我的第2个疑问"中断号错位"就自然成立了,因为VectAddrs[0]一般为正常的中断向量地址,如果经常性的
VectAddrs[0]被执行,那么病症肯定在此.

"中断就复位的概率高达50%"--与菜农判断一致,病症找到了,好解决
假设VectAddrs[x]没被被装入到VectAddr中,且前次中断退出时执行
了VIC->VectAddr = 0x00;
那么本次的中断将会跳入VIC->VectAddr即PC=0,也就是"软件复位".

所以,汽车电子应该好好学学菜农的非典架构.

我的产品都敢全部采用,你做个实验不难吧~~~别学我偷懒~~~

系统分类: ARM  |  用户分类: 非典型LPCARM之攻防体系  |  标签: 无标签  |  来源: 整理  | 

点击查看原文

发表评论 阅读全文(1469) | 回复(0)

发表于 2007/1/30 7:38:58

0

关于投票

如何拦截向量中断

http://bbs.21ic.com/club/bbs/ShowAnnounce.asp?id=2420121

hotpower 发表于 2007-1-30 07:26 ZLG-ARM ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

39楼: "不稳定"还是不明白,估计你还缺一步拦截

"不稳定"???是什么意思???

丢中断???中断号错位???

丢中断有点伪中断的味道,这要从LPCARM的中断机制推起:

  当某个中断源被引发,IRQStatus或FIQStatus的某位将置'1',
VectAddrs[x]将被装入VectAddr,从而跳入
LDR     PC, [PC, #-0x0FF0];Vector from VicVectAddr
在此PC才将VectAddr装入后跳入VectAddr指出的地址,即散转了中断.
  假设VectAddrs[x]没被被装入到VectAddr中,且前次中断退出时执行
了VIC->VectAddr = 0x00;/* 通知VIC中断处理结束*/
那么本次的中断将会执行"软件复位",故中断肯定丢失.

所以我在实战中要避开VectAddrs[0],且以VectAddrs[0]为默认中断地址.
这样就可拦截非法中断了.当然其他不用的VectAddrs[x]我也指向默认中断地址.

假定该论证成立(我用软件仿真确实存在此隐患),那么我的第2个疑问"中断号错位"就自然成立了,因为VectAddrs[0]一般为正常的中断向量地址,如果经常性的
VectAddrs[0]被执行,那么病症肯定在此.

真正可靠的中断应该是类似PIC的单向量中断,即正确的中断应该是IRQStatus对应位上所对应的中断号的地址VectAddrs[x].

只有同时满足了这两个条件的才真正的是此时的中断.

VectAddr只是快速散转后的地址VectAddrs[x].

故可靠的ISR()应该是进入后立即判断IRQStatus对应位是否为'1',是则执行本ISR(),否则执行默认中断进行IRQStatus位比较分枝中断,此时实际是放弃了对
VectAddr的信任.

可能我说得不太明白或过于谨慎,但此法肯定能执行正确的中断(只要在向量中断被引发后).

若实际应该中断,但中断根本未被引发,那菜农也无力回天~~~



系统分类: ARM  |  用户分类: 非典型LPCARM之攻防体系  |  标签: 无标签  |  来源: 整理  | 

点击查看原文

发表评论 阅读全文(1869) | 回复(0)

发表于 2007/1/29 22:48:06

2

关于投票

菜农的真心告白

http://bbs.21ic.com/club/bbs/ShowAnnounce.asp?id=2420121

LPC2368,Timer之外的中断很不稳定,请各位大虾指教,谢谢!
汽车电子 发表于 2007-1-19 23:42 ZLG-ARM ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴

   用LPC21xx、LPC22xx做产品也很久了,且很稳定。

   我就觉得奇怪了,Keil的RTL用Timer0,也是中断的,就很稳定,没watchdog,运行几天几夜都不死机。 我参考了RTL的中断初始化及中断函数,其它中断就是不稳定,经常一中断就复位。

   哪些朋友在用LPC236x搞开发,多多指教,谢谢谢谢!

我认为在现行条件下非典估计是有效的方法
hotpower 发表于 2007-1-29 22:34 ZLG-ARM ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴

可以说我非常深入地研究了LPCARM的中断体系.
菜农对23xx的中断体系的10点请教意见一文.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;               LPC23xx非典FLASHROM的中断向量表架构
                IMPORT  VIC_Vect_Addr0
IRQ_Handler     STMFD   SP!, {R11, R12, LR};真保护R11R12, 假保护LR(用于运算)
;//                LDR     R12, VIC_Vect_Addr   ;取VICVectAddr物理地址
;//                LDR     R12, [R12]        ;取出取VICVectAddr内实际向量中断号(非地址)
                LDR     R12, [PC , #-0x14c];取出取VICVectAddr内实际向量中断号(非地址)
                AND     R12, #0x1f      ;防止32个中断序号越界,在此可再做序号越界处理(可省略)
                LDR     R11, =VIC_Vect_Addr0
                LDR     R12, [R11, R12, LSL #2];散转到用户真正的向量中断地址
                STR     R12, [SP, #0x08];将中断向量地址R12写入事先保存的那个LR空间
                LDMFD   SP!, {R11, R12, PC};恢复R11R12,同时PC跳入中断向量地址执行
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

在这个架构中,进入中断比正常的多了7条ARM指令,但它的可靠性却增加很多,我已论述了很多并经过产品实战批量生产.

最近我在做作业,主要的目的是如何从MCU向ARM过渡.最终我首选了LPC213x/210x系列.

被菜农这么一搞,实在不象话---因为最后ARM比MCU更简单和好用.

通过这个架构,融合了MCU的多中断向量和单中断向量等特点,做到了像PIC的
单中断向量架构的可靠且比其散转迅速,又不失多中断向量的功能明确性.

汽车电子说"中断不稳定"我不太明白...
但是我敢肯定菜农的拦截方式肯定可靠,虽然速度有点损失,但安全和速度选择其一时,前者估计是多数人的选择.

ARM的指令系统非常完美,这是一般MCU和DSP都不如的,他们都要在中断中保护大量的现场数据,而ARM要开销的少得多.

难道MCU的多字节指令集和低速我们都能宽容,那么菜农多7条ARM指令就不对吗???

中断向量表在RAM中可靠还是在FLASH中更可靠这个问题没意思去争论,只能通过事实来说话.
就如一个行业旗手的一位总工不听菜农的意见,将海量数据存放在RAM中用电池维持掉电后的数据不丢失.
由于每天必须开关机一次,维持约10个小时.(电池的容量肯定没问题)
当产品使用后且在干扰强烈的环境下,其惨状我就不列举了~~~

我当初对他说:我们不能像书本上设计产品那样,我们必须考虑安全可靠.
但得到的是:"你们农民知道个什么???我们的产品就只差做到联合国了"...
哈哈~~~说笑了,原话当然不会是这样,但傲慢的劲头是十足的~~~

最后~~~只能后悔没听老农的真心告白~~~

系统分类: ARM  |  用户分类: 非典型LPCARM之攻防体系  |  标签: 无标签  |  来源: 整理  | 

点击查看原文

发表评论 阅读全文(1290) | 回复(0)

Total , Page /