1. 程式人生 > >Cubieboard上使用U-boot通過定時器中斷控制LED

Cubieboard上使用U-boot通過定時器中斷控制LED


繼LED之後,學習使用A10中斷,目的是學習U-boot中如何使用中斷。


軟體環境: 筆記本一臺,安裝WindowsXP sp3

                     XP下軟體:Source Insight 3.5;SecureCRT;VMware Workstation7.0

                    虛擬機器中安裝ubuntu10.04

                    ubuntu中軟體:Vim;編譯工具鏈 arm-none-eabi- 版本4.7.2

硬體環境:cubieboard,淘寶自帶的串列埠線和電源線

                    microSD卡一隻,讀卡器一個

                   CB的原理圖

                   A10使用者手冊



一、程式碼分析進入點,釐清脈絡
   從上次開啟LED控制就發現了http://blog.csdn.net/andy_wsj/article/details/8973818,檔案status_led.c檔案內的函式status_led_tick將會在定時器中斷中被
呼叫,在工程內搜尋status_led_tick,獲得4個結果,兩個在interrupts.c下。進入檢視,閱讀上下文,可以看出,這是在定時器中斷中呼叫,實現定時LED閃爍控制。
    檢視檔案,希望獲得中斷處理部分程式碼。在任何平臺下,使用中斷之前都要初始化,因此在工程搜尋這個檔案裡面的函式interrupt_init,獲得很多結果。呼叫的地方暫時不理會,只看定義。A10是ARM平臺,理所當然的檢視ARM架構lib裡面的定義:
Interrupts.c (d:\share\u-boot-sunxi-sunxi\arch\arm\lib):int interrupt_init (void)
可以看到,若要使用中斷,需要定義預編譯巨集:
CONFIG_USE_IRQ


在include/configs/sunxi-common.h中定義之,然後編譯u-boot,提示兩個錯誤:
CONFIG_STACKSIZE_IRQ 未定義
CONFIG_STACKSIZE_FIQ 未定義
就是中斷的棧大小沒定義,先在include/configs/sunxi-common.h定義兩個,不知到多大合適,暫時定義10K
#define CONFIG_STACKSIZE_IRQ (10 * 1024)
#define CONFIG_STACKSIZE_FIQ (10 * 1024)


再次編譯u-boot,再次提示錯誤,start.S裡面的do_irq沒定義,開啟
\u-boot-sunxi-sunxi\arch\arm\cpu\armv7\start.S,搜尋do_irq,可以看到:


#ifdef CONFIG_USE_IRQ


.align 5
irq:
get_irq_stack
irq_save_user_regs
bldo_irq
irq_restore_user_regs


.align 5
fiq:
get_fiq_stack
/* someone ought to write a more effective fiq_save_user_regs */
irq_save_user_regs
bldo_fiq
irq_restore_user_regs


#else


.align 5
irq:
get_bad_stack
bad_save_user_regs
bldo_irq


.align 5
fiq:
get_bad_stack
bad_save_user_regs
bldo_fiq


#endif /* CONFIG_USE_IRQ */


很明顯,這就是中斷處理了。
繼續看看標號irq,fiq,在檔案start.S開頭的地方:
.globl _start
_start: breset
ldrpc, _undefined_instruction
ldrpc, _software_interrupt
ldrpc, _prefetch_abort
ldrpc, _data_abort
ldrpc, _not_used
ldrpc, _irq
ldrpc, _fiq
#ifdef CONFIG_SPL_BUILD
_undefined_instruction: .word _undefined_instruction
_software_interrupt:.word _software_interrupt
_prefetch_abort:.word _prefetch_abort
_data_abort:.word _data_abort
_not_used:.word _not_used
_irq:.word _irq
_fiq:.word _fiq
_pad:.word 0x12345678 /* now 16*4=64 */
#else
_undefined_instruction: .word undefined_instruction
_software_interrupt:.word software_interrupt
_prefetch_abort:.word prefetch_abort
_data_abort:.word data_abort
_not_used:.word not_used
_irq:.word irq
_fiq:.word fiq
_pad:.word 0x12345678 /* now 16*4=64 */
#endif/* CONFIG_SPL_BUILD */
我們已經來到整個u-boot開始的地方,即上電之後一條被執行的指令就是這裡
_start: breset


接下來幾句就是異常處理
ldrpc, _undefined_instruction
ldrpc, _software_interrupt
ldrpc, _prefetch_abort
ldrpc, _data_abort
ldrpc, _not_used
ldrpc, _irq
ldrpc, _fiq
發生什麼型別的異常就是跳到對應的位置進行處理,再看看
_irq:.word irq
_fiq:.word fiq


由此可見,假設發生一個irq,那麼首先執行
ldrpc, _irq
_irq就是irq
(_irq==irq)->do_irq,就跳到中斷處理函式去了,如何實現do_irq呢?在工程內搜尋之。結果不多,逐個檢視,發現就是各種實現方式,對於A10,我覺得自己修改一種方式有利於學習,
最後挑了Interrupts.c (d:\share\u-boot-sunxi-sunxi\arch\arm\cpu\arm720t):void do_irq (struct pt_regs *pt_regs)
我決定把這一個檔案修改成能在當前平臺下使用,並將這個檔案放在\u-boot-sunxi-sunxi\arch\arm\cpu\armv7\sunxi\下,
修改該目錄Makefile檔案,增加如下幾句:
ifdef CONFIG_USE_IRQ
COBJS   += interrupts.o
endif


再增加一個檔案Interrupts.h,用來定義A10的中斷暫存器地址和中斷源,放在\u-boot-sunxi-sunxi\arch\arm\include\asm\arch-sunxi目錄下。
目的是同過timer0中斷控制LED閃爍,其他中斷暫時都不會開啟,但是會定義,為進一步學習其他模組做準備。


二、瞭解中斷機制,修改程式碼
準備寫程式碼了,應該看一看A10使用者手冊,仔細閱讀中斷和定時器相關的章節
在“intterrupt controller”這一章,所有中斷都在這裡描述
在“timer controller”這一章,也描述了與定時器相關的暫存器


1、程式碼編寫和修改。
修改\u-boot-sunxi-sunxi\arch\arm\cpu\armv7\sunxi\timmer.c裡面的timmer_init函式,使之符合中斷要求。
/*
 * (C) Copyright 2007-2011
 * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
 * Tom Cubie <
[email protected]
>
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */


#include <common.h>
#include <asm/io.h>
#include <asm/arch/timer.h>
#include <asm/arch/interrupts.h>


DECLARE_GLOBAL_DATA_PTR;


#define TIMER_MODE   (0 << 7)   /* continuous mode */
#define TIMER_DIV    (0 << 4)   /* pre scale 1 */
#define TIMER_SRC    (1 << 2)   /* osc24m */
#define TIMER_RELOAD (1 << 1)   /* reload internal value */
#define TIMER_EN     (1 << 0)   /* enable timer */


#define TIMER_CLOCK      (24 * 1000 * 1000)
#define COUNT_TO_USEC(x)((x) / 24)
#define USEC_TO_COUNT(x)((x) * 24)
#define TICKS_PER_HZ(TIMER_CLOCK / CONFIG_SYS_HZ)
#define TICKS_TO_HZ(x)((x) / TICKS_PER_HZ)


#define TIMER_LOAD_VAL     TICKS_PER_HZ


#define TIMER_NUM    (0)        /* we use timer 0 */


static struct sunxi_timer *timer_base =
&((struct sunxi_timer_reg *)SUNXI_TIMER_BASE)->timer[TIMER_NUM];


/* macro to read the 32 bit timer: since it decrements, we invert read value */
#define READ_TIMER() (~readl(&timer_base->val))


/* init timer register */
int timer_init(void)
{
unsigned int val;


writel(TIMER_LOAD_VAL, &timer_base->inter);
writel(TIMER_MODE | TIMER_DIV | TIMER_SRC | TIMER_RELOAD | TIMER_EN, &timer_base->ctl);


#if defined(CONFIG_USE_IRQ)
        val = readl(SUNXI_TIMER_BASE + 0x04);
        val |= (0x1 << 0);
writel( val, SUNXI_TIMER_BASE + 0x04); /* clear timer0 irq pending  */


/* enable timer0 interrupt*/
        val = readl(SUNXI_TIMER_BASE);
        val |= (0x1 << 0);
writel( val, SUNXI_TIMER_BASE); /* Enable timer0 irq */


        writel( (1 << (INT_TIM0 % 32)), INTC_EN_REG0 + (INT_TIM0 >> 5));

#if defined(TIMER_DEBUG)
printf("Timer init done.\n");
#endif
#endif
return 0;
}


/* timer without interrupts */
ulong get_timer(ulong base)
{
return get_timer_masked() - base;
}


ulong get_timer_masked(void)
{
/* current tick value */
ulong now = TICKS_TO_HZ(READ_TIMER());


if (now >= gd->lastinc)/* normal (non rollover) */
gd->tbl += (now - gd->lastinc);
else/* rollover */
gd->tbl += (TICKS_TO_HZ(TIMER_LOAD_VAL) - gd->lastinc) + now;
gd->lastinc = now;
return gd->tbl;
}


/* delay x useconds */
void __udelay(unsigned long usec)
{
long tmo = usec * (TIMER_CLOCK / 1000) / 1000;
ulong now, last = READ_TIMER();


while (tmo > 0) {
now = READ_TIMER();
if (now > last)/* normal (non rollover) */
tmo -= now - last;
else/* rollover */
tmo -= TIMER_LOAD_VAL - last + now;
last = now;
}
}


/*
 * This function is derived from PowerPC code (read timebase as long long).
 * On ARM it just returns the timer value.
 */
unsigned long long get_ticks(void)
{
return get_timer(0);
}


/*
 * This function is derived from PowerPC code (timebase clock frequency).
 * On ARM it returns the number of timer ticks per second.
 */
ulong get_tbclk(void)
{
ulong tbclk;
tbclk = CONFIG_SYS_HZ;
return tbclk;
}


增加\u-boot-sunxi-sunxi\arch\arm\cpu\armv7\sunxi\interrupts.c,這個是修改過來的。修改Makefile,使之可編譯到u-boot。
將status_led_tick增加到timer_isr呼叫中,若正常,板上的led將閃爍。
/*
* for sun4i A10 
* by Andy 2013.5
*/


#include <common.h>
#include <asm/io.h>
#include <asm/arch/interrupts.h>
#include <asm/arch/timer.h>




#if defined(CONFIG_USE_IRQ) && defined(CONFIG_SUN4I)
static struct _irq_handler IRQ_HANDLER[N_IRQS];


static void default_isr( void *data) {
printf ("default_isr():  called for IRQ %d\n", (int)data);
}


static void timer_isr( void *data) {
unsigned int *pTime = (unsigned int *)data;
unsigned int val;


(*pTime)++;
status_led_tick ((unsigned long)(*pTime));


#if defined(TIMER_DEBUG)
printf("Timer_isr running.\n");
#endif


        val = readl(SUNXI_TIMER_BASE + 0x04);
        val |= (0x1 << 0);
writel( val, SUNXI_TIMER_BASE + 0x04); /* clear timer0 irq pending  */
}


void do_irq (struct pt_regs *pt_regs)
{
unsigned int pending;
unsigned int vector;
unsigned int int_source;

vector  = readl( INTC_VECTOR_REG);
if( (int_source = (vector >> 2)) < N_IRQS )  
{
 switch(int_source >> 5 ){
    case  0:
                            pending = INTC_IRQ_PEND_REG0;
       break;
    case  1:
                            pending = INTC_IRQ_PEND_REG1;
       break;
    case  2:
       break;
                            pending = INTC_IRQ_PEND_REG2;
    default:
                            pending = INTC_IRQ_PEND_REG0;
       break;
 }
       if( (readl(pending) >> ( int_source % 32 )) & 0x01 ){


IRQ_HANDLER[int_source].m_func( IRQ_HANDLER[int_source].m_data);

/* clear pending interrupt */
writel( ~(1 << (int_source % 32)), pending);
}
    
}else{

default_isr(&vector);
}
}




static ulong timestamp;
static ulong lastdec;
int arch_interrupt_init (void)
{
int i;


/* install default interrupt handlers */
for ( i = 0; i < N_IRQS; i++) {
IRQ_HANDLER[i].m_data = (void *)i;
IRQ_HANDLER[i].m_func = default_isr;
}


/* configure interrupts for IRQ mode */
writel( 0x0, INTC_IRQ_TYPE_SEL0);
writel( 0x0, INTC_IRQ_TYPE_SEL1);
writel( 0x0, INTC_IRQ_TYPE_SEL2);

/* clear any pending interrupts */
writel( 0x0, INTC_IRQ_PEND_REG0);
writel( 0x0, INTC_IRQ_PEND_REG1);
writel( 0x0, INTC_IRQ_PEND_REG2);

writel( 0x0, INTC_FIQ_PEND_REG0);
writel( 0x0, INTC_FIQ_PEND_REG1);
writel( 0x0, INTC_FIQ_PEND_REG2);

lastdec   = 0;
timestamp = 0;
/* install interrupt handler for timer */
IRQ_HANDLER[INT_TIM0].m_data = (void *)&timestamp;
IRQ_HANDLER[INT_TIM0].m_func = timer_isr;

#if defined(TIMER_DEBUG)
printf("Interrupts initialize done.\n");
#endif


return 0;
}


#else
#error do_irq no define for this CPU type
#endif


增加\u-boot-sunxi-sunxi\arch\arm\include\asm\arch-sunxi\interrupts.h,用來定義A10的中斷暫存器地址,中斷源和中斷資料結構。
/************************************/
/*     A10 interrupt register list  */
/************************************/
#define INTC_REG_BASE         0x01C20400
#define INTC_VECTOR_REG      (INTC_REG_BASE + 0x0000)
#define INTC_BASE_ADDR_REG   (INTC_REG_BASE + 0x0004)
#define INTC_INTCTRL_REG     (INTC_REG_BASE + 0x000C)
#define INTC_IRQ_PEND_REG0   (INTC_REG_BASE + 0x0010)
#define INTC_IRQ_PEND_REG1   (INTC_REG_BASE + 0x0014)
#define INTC_IRQ_PEND_REG2   (INTC_REG_BASE + 0x0018)
#define INTC_FIQ_PEND_REG0   (INTC_REG_BASE + 0x0020)
#define INTC_FIQ_PEND_REG1   (INTC_REG_BASE + 0x0024)
#define INTC_FIQ_PEND_REG2   (INTC_REG_BASE + 0x0028)
#define INTC_IRQ_TYPE_SEL0   (INTC_REG_BASE + 0x0030)
#define INTC_IRQ_TYPE_SEL1   (INTC_REG_BASE + 0x0034)
#define INTC_IRQ_TYPE_SEL2   (INTC_REG_BASE + 0x0038)
#define INTC_EN_REG0         (INTC_REG_BASE + 0x0040)
#define INTC_EN_REG1         (INTC_REG_BASE + 0x0044)
#define INTC_EN_REG2         (INTC_REG_BASE + 0x0048)
#define INTC_MASK_REG0       (INTC_REG_BASE + 0x0050)
#define INTC_MASK_REG1       (INTC_REG_BASE + 0x0054)
#define INTC_MASK_REG2       (INTC_REG_BASE + 0x0058)
#define INTC_RESP_REG0       (INTC_REG_BASE + 0x0060)
#define INTC_RESP_REG1       (INTC_REG_BASE + 0x0064)
#define INTC_RESP_REG2       (INTC_REG_BASE + 0x0068)
#define INTC_FF_REG0         (INTC_REG_BASE + 0x0070)
#define INTC_FF_REG1         (INTC_REG_BASE + 0x0074)
#define INTC_FF_REG2         (INTC_REG_BASE + 0x0078)


#define INTC_PRIO_REG0       (INTC_REG_BASE + 0x0080)
#define INTC_PRIO_REG1       (INTC_REG_BASE + 0x0084)
#define INTC_PRIO_REG2       (INTC_REG_BASE + 0x0088)
#define INTC_PRIO_REG3       (INTC_REG_BASE + 0x008C)
#define INTC_PRIO_REG4       (INTC_REG_BASE + 0x0090)




/************************************/
/*     A10 interrupt source         */
/************************************/
#define INT_EXTNMI    0
#define INT_UART0     1
#define INT_UART1     2
#define INT_UART2     3
#define INT_UART3     4
#define INT_IR0       5
#define INT_IR1       6
#define INT_TWI0      7
#define INT_TWI1      8
#define INT_TWI2      9
#define INT_SPI0      10
#define INT_SPI1      11
#define INT_SPI2      12
#define INT_NC        13
#define INT_AC97      14
#define INT_TS        15
#define INT_IIS       16
#define INT_UART4     17
#define INT_UART5     18
#define INT_UART6     19
#define INT_UART7     20
#define INT_KEYPAD    21
#define INT_TIM0      22
#define INT_TIM1      23
#define INT_TIM2_ALARM_WD    24
#define INT_TIM3      25
#define INT_CAN       26
#define INT_DMA       27
#define INT_PIO       28
#define INT_TOUCHPANEL       29
#define INT_AUDIOCODEC       30
#define INT_LRADC     31
#define INT_SD_MMC0   32
#define INT_SD_MMC1   33
#define INT_SD_MMC2   34
#define INT_SD_MMC3   35
#define INT_RSVD1     36
#define INT_NAND      37
#define INT_USB0      38
#define INT_USB1      39
#define INT_USB2      40
#define INT_SCR       41
#define INT_CSI0      42
#define INT_CSI1      43
#define INT_LCD_CON0  44
#define INT_LCD_CON1  45
#define INT_MP        46
#define INT_DE_FE0_BE0       47
#define INT_DE_FE1_BE1       48
#define INT_PMU       49
#define INT_SPI3      50
#define INT_TZASC     51
#define INT_PATA      52
#define INT_VE        53
#define INT_SS        54
#define INT_EMAC      55
#define INT_RSVD2     56
#define INT_RSVD3     57
#define INT_HDMI      58
#define INT_TVE0_1    59
#define INT_ACE       60
#define INT_TVD       61
#define INT_PS2_0     62
#define INT_PS2_1     63
#define INT_USB3      64
#define INT_USB4      65
#define INT_PLE_PREFMU      66
#define INT_TIM4      67
#define INT_TIM5      68
#define INT_GPU_GP    69
#define INT_GPU_GPMMU       70
#define INT_GPU_PP0   71
#define INT_GPU_PPMMU0      72
#define INT_GPU_PMU   73
#define INT_GPU_RSV0  74
#define INT_GPU_RSV1  75
#define INT_GPU_RSV2  76
#define INT_GPU_RSV3  77
#define INT_GPU_RSV4  78
#define INT_GPU_RSV5  79
#define INT_GPU_RSV6  80


#define N_IRQS        (80)


#ifndef __ASSEMBLER__
struct _irq_handler {
void                *m_data;
void (*m_func)( void *data);
};
#endif 




2、瞭解呼叫關係,使編譯之後的程式碼能正常執行
只要timmer0初始化和中斷初始化正常,那麼就可以產生timer0中斷。
那麼timer_init被誰呼叫了呢?工程中搜索timer_init,結果很多,逐個觀察,可以肯定初始化在board.c裡面,A10為ARM,所以一定在ARM平臺的程式碼內:
Board.c (d:\share\u-boot-sunxi-sunxi\arch\arm\lib):timer_init,/* initialize timer */
閱讀上下文,可以看到,在函式board_init_f內通過一個轉移表init_sequence呼叫了timer_init。


再來看看,中斷初始化在哪呼叫的,搜尋interrupt_init,跟timer_init在同一個檔案裡
Board.c (d:\share\u-boot-sunxi-sunxi\arch\arm\lib):interrupt_init();
這個interrupt_init就是這篇文章開始收搜尋的函式,在檔案:Interrupts.c (d:\share\u-boot-sunxi-sunxi\arch\arm\lib):int interrupt_init (void)
它呼叫了arch_interrupt_init函式,不用看,這就在我們自己寫的檔案\u-boot-sunxi-sunxi\arch\arm\cpu\armv7\sunxi\interrupts.c裡面
確定呼叫完整。


3、寫到SD卡內,測試之。
中斷週期太大,採用24M的外部時鐘,而CONFIG_SYS_HZ的值為1000,即中斷1000次為1秒鐘,每次中斷為1ms,因此timer0的過載值為  24M/1000 
修改:
#define TIMER_LOAD_VAL     TICKS_PER_HZ

這個巨集之後,可以獲得正確的CONFIG_SYS_HZ時間值

設定CONFIG_SYS_HZ時,LED的閃爍可以做到1秒一次

相關推薦

Cubieboard使用U-boot通過定時中斷控制LED

繼LED之後,學習使用A10中斷,目的是學習U-boot中如何使用中斷。 軟體環境: 筆記本一臺,安裝WindowsXP sp3                      XP下軟體:Source Insight 3.5;SecureCRT;VMware Worksta

STM32之定時中斷控制LED閃爍

上篇部落格我們是用延時函式實現了LED的閃爍,今天我們使用STM32的定時器來使LED閃爍。 關於32的定時器的種類,今天我在這先不做過多的說明,有時間我會再另寫一篇部落格來專門介紹32的定時器。今天我們使用32的定時器3來產生中斷,以實現LED的閃爍。 今

51微控制器定時中斷控制燈1S亮的程式

#include   <AT89X51.H>unsigned char i=0,j=0; void main(){ TMOD=0X01; TH0=0X4c; TL0=0X00; TR0=1;ET0=1;EA=1;P0_3=1;  while(1)   {};} t

Stm32定時中斷使LED燈閃爍

知識點: Stm32共有11個定時器: 1.兩個高階定時器:TIM1、TIM8-------------------------APB2 2.四個通用定時器:TIM2~TIM5-------------------------APB1 3.兩個基本定時器:TIM6、TIM7

定時中斷實現LED閃爍

#include <reg52.h> typedef unsigned char u8; typedef unsigned int u16; sbit led=P2^0; void T

CC2530通過定時3中斷方式每10ms輸出一個下降沿

Request/Task: 由於專案中硬體電路遲遲未到位,故利用一個CC2530板子的P0.0口作為輸出,模擬10ms一次的下降沿中斷,給除錯電路板。 Idea 定時器3和定時器4是兩個8位定時器,一般上,控制暫存器TxCTL被用來控制定時器模式。本文選用的是自由執行模式,

stm32-定時中斷

cmd open 兩個 typedef clock 數據手冊 濾波 重裝 fin 由於現在是在學用庫函數操作,我的目標是知道用到的每個函數的作用,需要的時候可以加以更改使用,所以關鍵是要怎麽知道stm32各函數的作用 雖然從名字上也能知道個大概,但是細節還是要查stm3

Spring 通過定時 通過反射 Resource Dao層為空

技術分享 方法 img global getbean code oba 技術 需要 通過定時器,調用方法,方法中需要用到Dao層實體,Resource時為空 跟換Dao的註入方式: 從 Resource 改為 GlobalFunction.getBeanByName()即可

ubuntuu-boot的編譯

復制 span ubuntu虛擬機 str 可執行文件 linu 編譯 解壓 自定義 1,下載u-boot 2,將Windows中的u-boot復制到ubuntu虛擬機中自定義目錄並解壓 3,進入該目錄cd 4,安裝dtc:sudo apt-get install devi

TI CC2530 學習筆記-7-NewBit-CC2530-Interrupt-定時中斷

TI CC2530 學習筆記-目錄 TI CC2530 學習筆記-7-NewBit-CC2530-Interrupt-定時器中斷 設定CC2530定時器4每1ms中斷一次,在中斷裡對溢位進行計數,當計數達到1000次(1秒)時小燈狀態改變。 配置定時器和LED

51微控制器使用定時中斷模擬PWM控制埠電壓

  最近應實驗室需求寫一篇51微控制器產生PWM的文章供參考.   微控制器晶片STC89C52,晶振12MHz,編譯環境Keil5.   分析:若使微控制器埠為高電平, 則微控制器輸出電壓為恆值5V. 反之低電平輸出電壓為0V. 但是我們如果在週期為T的時間內

Broadcast基礎(使用廣播,傳送臨時廣播,註冊接收器,通過定時設定定時廣播)

舉例場景: 碎片將資訊傳回頁面,介面卡向頁面傳回訊息 (一)Fragment提供了onAttach()方法,onAttach方法指定結合了Activity物件。定義一個回撥介面,把Activity物件強制轉換為回撥介面就可以在碎片中呼叫頁面方法 (二)Broadcast 

spring boot定時的使用

有時候,我們需要我們的專案定時的去執行一些方法 要想在spring boot 中使用定時器,其實非常簡單 第一步: 在spring boot的入口處新增@EnableScheduling這個註解,如下 @SpringBootApplication @EnableScheduling

[STM32F103]定時中斷

l 使能定時器時鐘。   RCC_APB1PeriphClockCmd(); l 初始化定時器,配置ARR,PSC。   TIM_TimeBaseInit(); l 開啟定時器中斷,配置NVIC。   void TIM_ITConfig();   NVIC_Init(

微控制器MSP430 - Timer_A 定時中斷程式

一、利用定時器定時功能,實現定時器單個溢位中斷,實現 P3.0 方波輸出 #include "cc430x613x.h" void main() { WDTCTL = WDTPW + WDTHOLD; // 停止看門狗定時器 P3DIR |=

stm32f103定時中斷

stm32為我們提供了8個定時器,分為:通用是定時器(TIM2~TIM5),高階定時器(TIM1和TIM8),基本定時器(TIM6和TIM7)。 至於三者之間的區別可以參考以下部落格:https://blog.csdn.net/dukai392/article/details/72058041

ZYNQ-7000私有定時中斷

  轉自:https://blog.csdn.net/RZJMPB/article/details/50812579 本片文章將在ZYNQ的純PS裡實現私有定時器中斷。每個一秒中斷一次,在中斷函式裡計數加1,通過串列埠列印輸出。 *本文所使用的開發板是Miz702(相容zedb

C6678定時中斷學習180614

第一次寫部落格,希望能夠在兩年內記錄一下自己的學習歷程。目前剛開始接觸DSP,所以在學習DSP上會對多寫點,如果有不對的地方 希望大家能夠不吝賜教! 話不多說,接觸的6678板子,所以先從6678的中斷部分開始寫起,之前寫了一個GPIO的,但是樓主發現腦子短路了,因為沒有外部中斷GPIO

C51--點亮LED燈(for迴圈、while迴圈、定時中斷迴圈)

第一步:開啟keil4,建立工程,at89c52。 1.點亮第一個LED燈 #include<reg52.h> sbit led=P2^0; void main() { led=0;//低電平亮 } 2.利用延時來使LED 1秒閃爍,500ms變

性能測試七:jmeter進階之文件傳下載、定時

同步 ner 功能 get 普通 web-inf bubuko 限制 tomcat-7 一、上傳下載 上傳: 1,POST請求,勾選 use …for post 2,同請求一起發送文件裏,填寫文件名稱,參數名稱 3,MIME類型: application/octet-str