久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4404|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

NIOS II 9.1 SP1中斷問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:104287 發(fā)表于 2016-1-31 04:17 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 51黑fan 于 2016-1-31 04:19 編輯

首先NIOS 91用了增強(qiáng)型中斷,當(dāng)然這不是問題的關(guān)鍵,我不詳說,看牙縫的博客
     debug 進(jìn)了中斷n次看細(xì)節(jié),無奈真想砸電腦,下面是alt_ic_arq_register() 原型以及內(nèi)部的int alt_irq_register,我不知道為什么這就是所謂的增強(qiáng)型,聽說是為了便于以后升級(jí):
int alt_ic_isr_register(alt_u32 ic_id, alt_u32 irq, alt_isr_func isr,
  void *isr_context, void *flags)
{
    return alt_irq_register(irq, isr_context, isr);
}
int alt_irq_register (alt_u32 id,
                      void* context,
                      alt_isr_func handler)
{
  int rc = -EINVAL;  
  alt_irq_context status;
  if (id < ALT_NIRQ)
  {
    /*
     * interrupts are disabled while the handler tables are updated to ensure
     * that an interrupt doesn't occur while the tables are in an inconsistant
     * state.
     */
    status = alt_irq_disable_all ();
    alt_irq[id].handler = handler;
    alt_irq[id].context = context;
    rc = (handler) ? alt_irq_enable (id): alt_irq_disable (id);
    alt_irq_enable_all(status);
  }
  return rc;
}
     在群里大俠的幫助下,還是NND的不行。。。在與牙縫和o my god的共同協(xié)作下,還是不行。。。昏了
     最后不小心試試看是不是多路除了問題,然后單路,竟然可以了,回過頭去看SOPC,發(fā)現(xiàn)剛好忘了選擇Enable bit_clearing。。。這樣就行了。
     昏,知其然,不知道其所以然,尋找問題的答案!!!于是和我?guī)煾阜治鰹槭裁矗浚浚繋熗絻山鉀Q了n久n久,終于解決了師父一年前的問題以后我此刻最難受的郁悶:都是Eanbel bit_clearing惹的禍:
意思是說:
     Bit n 在邊沿捕獲寄存器中,如果捕獲了輸入(相應(yīng)的上升沿,下降沿),相應(yīng)位的位就會(huì)被置1 。一個(gè)阿窩龍妹妹外設(shè)可以讀取邊沿捕獲寄存器,來決定發(fā)生在PIO引腳的邊沿變化。 如果選項(xiàng)“Enable bit_clearing for edge capture register”被關(guān)閉,寫任意的值到邊沿捕獲寄存器將會(huì)清除所有寄存器。反之,寫一個(gè)1到寄存器中一個(gè)特別的位,將會(huì)使得邊沿捕獲失去作用。
     根據(jù)我的實(shí)際測(cè)試,驗(yàn)證了以上的一些理論
(1)Enable bit_clearing 打開的時(shí)候:
     因?yàn)閐s說1 的時(shí)候清中斷,所以IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_DATA_BASE, 0x03);清了我兩個(gè)按鍵的中斷,問題成功解決。
(2)Enable bit_clearing 關(guān)閉的時(shí)候:
     因?yàn)閐s說任意值寫入都將會(huì)清除所有的邊沿捕獲寄存器,所以IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_DATA_BASE, any vaule);都能使得edgecapture清零,實(shí)際測(cè)試用了“IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_DATA_BASE, 0x00);”和“IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_DATA_BASE, 0x03);”,都達(dá)到了效果。當(dāng)然習(xí)慣性的我們會(huì)用0來清零,以至于讓人再次產(chǎn)生了誤解。
可是明擺著這些都能達(dá)到目的嘛,altera為啥要搞得那么尷尬呢??有必要嗎???
     根據(jù)我?guī)煾傅慕忉專忉屓缦拢?/font>
(1)在一般情況下,外部中斷不會(huì)同時(shí)達(dá)到,因此bit_clearing顯得沒有什么意義,比如我們捕獲按鍵,那個(gè)按下就讓那個(gè)LED亮,同時(shí)按下就同時(shí)亮,這個(gè)完全沒問題,直接IOWR_ALTERA_AVALON_PIO_DATA(LED_DATA_BASE, edge_capture);嘛!!!
(2)但是這不否決中斷同步捕獲的情況。當(dāng)中斷同步捕獲的時(shí)候,可以用bit_clearing來干活了,也許可以更加的靈活。因?yàn)橹袛嗤瑫r(shí)達(dá)到的時(shí)候,PIO當(dāng)然能夠同時(shí)捕獲兩個(gè)中斷信號(hào),但是此時(shí)main()函數(shù)里面的執(zhí)行就很尷尬了,兩個(gè)中斷到底聽誰的呢?(你爸媽一個(gè)讓你幫他做飯,一個(gè)讓你陪他下棋,媽的老子聽誰的,不干了繼續(xù)玩NIOS2!)
      這相當(dāng)于verilog中的異步,需要同步處理之后才OK)。因此利用bit_clearing來屏蔽同時(shí)捕獲中斷的位,下一次再屏蔽另一個(gè)來讓CPU執(zhí)行命令,給CPU完成一個(gè)該聽誰的機(jī)會(huì),這樣也能有效防止CPU死機(jī)(TMD老子不干了)。
     因?yàn)镻IO IRS這個(gè)在SOPC中指分配了一個(gè)IRQ,所以無所謂單片機(jī)中的“中斷優(yōu)先級(jí)”的說法,所以只能通過bit_clearing來更完美的分配CPU 的任務(wù)。
     以上說明基本上解釋了以下ZLG的翻譯是錯(cuò)了,以前我也對(duì)著ds發(fā)現(xiàn)過別的error,看來原汁原味的dt就是好!
最后解釋一個(gè)為什么在Enable bit_clearing 打開的時(shí)候,IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_DATA_BASE,0x00)為什么會(huì)死機(jī),程序卡死在初始化這句話中的問題:
     根據(jù)altera的dt(我以上分析的(2)),講到了當(dāng)打開Enable bit_cleraing的時(shí)候,要給相應(yīng)位寫1,才能清除標(biāo)志位。(網(wǎng)上很多人都是給0清零的,這可能是因?yàn)樗麄儧]有打開Enbale bit_clearing),但是我們給了0 來清楚edagcapture,這樣根本不能清除中斷標(biāo)志,因此一次死在里面(所謂君讓臣死,臣不得不死,不死也得死)。只有清除了才可以,根據(jù)我的驗(yàn)證,此時(shí)寫1來清除相應(yīng)的bit,很好的解決了問題。
     這同時(shí)也反駁了牙縫的博客,誘惑了我的致命問題(當(dāng)然我很感謝本人,因?yàn)樗麑?duì)我的幫助遠(yuǎn)勝過這兩天的痛苦,可能人家NC了失誤了哈哈):Enable bit_clearing打開了,而清除邊沿寄存器的時(shí)候卻給了0:http://www.cnblogs.com/yuphone/archive/2010/11/25/1887621.html
.
     問題到了現(xiàn)在算是比較清晰了,還以為ALtera自己神經(jīng)病,最后發(fā)現(xiàn)不是軟件問題,也不是altera神經(jīng)病,而是我們沒有好好啃ds。
     師父說:“altara是奧特拉,是奧特曼的弟弟,可牛逼了;MOTO是摩托羅拉,是摩托也要用騾來拉,可戳了。。”(師父真是個(gè)神!!!)因此不能一直埋怨altera,他們做的事情一般都是有哥根據(jù)的。
     下面貼上代碼,呵呵,給自己留個(gè)底:
一般情況下,不管你Enable bit_clearing怎么配置,給1 清零永遠(yuǎn)不會(huì)錯(cuò)!!!
/*
* sys_main.c
*
*  Created on: 2011-4-1
*      Author: CrazyBingo
*/
#include <stdio.h>
#include "unistd.h"
#include "system.h"
#include "alt_types.h"
#include "sys/alt_irq.h"
//#include "io.h"
#include "altera_avalon_pio_regs.h"
//#include "../inc/my_sopc.h"
//#include "../inc/key_scan.h"
void key_interrupts(void * key_isr_context);
void key_interrupts_init(void);
// 定義全局變量以儲(chǔ)存邊沿捕獲值
volatile int edge_capture;
int main(void)
{
    key_interrupts_init();
    while(1)
    {
        IOWR_ALTERA_AVALON_PIO_DATA(LED_DATA_BASE, edge_capture);
    }
    return 0;
}
//* 按鍵中斷初始化 */
void key_interrupts_init(void)
{
    /**//* Recast the edge_capture pointer to match the alt_irq_register() function
     * prototype. */
    void* edge_capture_ptr = (void*) &edge_capture;
    /**//* Enable all 2 button interrupts. */
    IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_DATA_BASE, 0x03);
    /**//* Reset the edge capture register.Enable bit_clearing turn0 off, write any vaule will take effect */
    IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_DATA_BASE, 0x03); //active High always take effect
    /**//* Register the interrupt handler. */
    alt_ic_isr_register
    (
            KEY_DATA_IRQ_INTERRUPT_CONTROLLER_ID,    // 中斷控制器標(biāo)號(hào),從system.h復(fù)制
            KEY_DATA_IRQ,                             // 硬件中斷號(hào),從system.h復(fù)制
            key_interrupts,                         // 中斷服務(wù)子函數(shù)
            edge_capture_ptr,                          // 指向與設(shè)備驅(qū)動(dòng)實(shí)例相關(guān)的數(shù)據(jù)結(jié)構(gòu)體
            NULL                                    // flags,保留未用
    );
}
//按鍵中斷服務(wù)程序(Interrupt service routime),每次下降沿進(jìn)入中斷執(zhí)行一次
void key_interrupts(void * key_isr_context)
{
    /**//* Cast context to edge_capture's type. It is important that this be
     * declared volatile to avoid unwanted compiler optimization.
     */
   volatile int* edge_capture_ptr = (volatile int*) key_isr_context;
    /**//* Store the value in the Button's edge capture register in *context. */
    *edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(KEY_DATA_BASE);
    /**//* Reset the edge capture register. */
    IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_DATA_BASE,0x03);
}
    終于可以進(jìn)行我下一步了。。。柳暗花明----有時(shí)候,解決為什么比解決怎么做更加的痛苦,但此時(shí)解決了師父和牙縫的的失誤,同時(shí),我終于可以放松一下了,這陣子因?yàn)檫@個(gè)中斷,因?yàn)镃yclone III PCB,快讓我over了,不過終于解決了問題,累著并且開心著。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费久久久 | 精品国产99 | 久久小视频 | 国产成人精品区一区二区不卡 | 精品欧美一区二区三区久久久 | 91久久久久久久久久久久久 | 99国产视频 | 欧美精品导航 | 欧美一区二区视频 | 美女黄网| 国产精品成人久久久久 | 日韩视频精品在线 | 日韩欧美在线观看一区 | 成人av色 | 亚洲欧美激情精品一区二区 | 亚洲欧美日韩一区 | 国产一区2区 | 网黄在线 | 午夜久久久 | 水蜜桃久久夜色精品一区 | 一二区视频 | 免费高清av | 好姑娘高清在线观看电影 | 成人av免费网站 | 亚洲欧洲精品一区 | 成人黄视频在线观看 | 波多野结衣一区二区三区 | 日韩成人中文字幕 | 午夜国产精品视频 | 欧美成人精品一区二区男人看 | 成人av片在线观看 | 欧美亚洲日本 | 中文字幕av在线 | 日韩欧美一级精品久久 | 国产乱码精品1区2区3区 | 国产日韩精品一区 | 亚洲区视频 | 人人插人人 | 成人欧美一区二区三区在线播放 | 亚洲欧美激情国产综合久久久 | 蜜桃传媒一区二区 |