mini2440按键中断

2023-11-05

ARM中断控制系统

按键驱动程序设计

一.Arm中断控制系统

1.查询方式

程序不断地查询设备的状态,并做出相应的反应。该方式实现比较简单,常用在比较单一的系统中,比如:一个温控系统中可以实用查询的方式不断检测温度变化。

特点:实现简单;但CPU利用率很低,不适合多任务的系统。

2.中断方式

当事件发生时,硬件会设置某个寄存器;CPU在每执行完一个指令时,查看这个寄存器,如果所关注的事件发生了,则中断当前程序,跳转到一个固定的地址处理这个事件,处理完后返回到被中断的程序中继续运行。

特点:实现相对复杂,但效率较高,是常用的方法。

 

中断处理流程:

(1)中断控制器汇集各类外设发出的中断信号然后通知CPU;

(2)CPU保存当前程序的运行环境然后调用中断服务程序ISR来处理中断

(3)ISR中通过读取外设的相关寄存器来识别中断的类型,并进行相应的处理

(4)清除中断:通过读写在相关中断控制寄存器和外设相关寄存器来实现;

(5)恢复被中断程序的执行环境继续执行被中断的程序。

 

简化版:

1.汇集中断信号,通知CPU;

2.CPU保存当前运行环境,调用中断服务程序ISR

3.ISR读取寄存器识别中断类型

4.清中断

5.恢复中断程序的执行环境;

速记版:会(汇集)CCPUI(ISR)(清中断)回复(恢复);

 

S3c2440支持60个中断源,含子中断源

SUBSRCPND(用于标明子中断源有没有发生中断)【发生中断被置1清除子中断写入1

SUBSRCPND寄存器用来表明子中断(如:INT_RXD0是否发生。S3C244015个子中断,SUBSRCPND中每一位对应一个子中断,当这些子中断发生时,相应的位置被置1.清除子中断只需向SUBSRCPND寄存器中相应位写入1.

 

INTSUBMSK屏蔽SUBSRCPND的中断,1时屏蔽子中断

INTSUBMSK寄存器用来屏蔽SUBSRCPND寄存器所标的中断。INTSUBMSK

寄存器中某位被设为1时,相应的子中断被屏蔽。设为0时,表示子中断被允许。

 

SRCPND(用于标明中断源有没有发生中断)【发生中断被置1清除(子)中断写入1

SRCPND某一位用来标明一个(或一类)中断是否已经发生。例如:SRCPND

寄存器中的子中断INT_RXD0发生了,且没有被INTSUBMSK屏蔽,则SRCPNDINT_UART0位被置1. SRCPND寄存器的清除与SUBSRCPND寄存器相似,若想清除某一位,往此位写入1.

 

INTMSK(被置1时,中断屏蔽; 0时,中断允许)

INTMSK寄存器用来屏蔽SRCPND所表示的中断。INTMSK某位被置为1时,对应的中断被屏蔽;设置为0时,相应中断被允许。

INTMSK只能屏蔽设为IRQ的中断,不能屏蔽设为FIQ的中断。

 

INTMODE1时,FIQ模式;  0时,IRQ模式

INTMODE寄存器中某位被设置为1时,它所对应的中断源会被设置为FIQ模式,即此时中断发生时,CPU将进入快速中断模式,这通常用来处理特别紧急的中断。当该位被置为0时,表示为IRQ模式。

 

FIQ & IRQ

(1)   IRQ模式下,中断处理程序需要自己保存R8R12这几个寄存器,退出中断处理时需要自己恢复这几个寄存器,而FIQ模式由于这几个寄存器都有back寄存器(fiq_r8….,模式切换时CPU自动保存这些值到back寄存器,退出FIQ模式时自动恢复,所以这个过程FIQIRQ快。

(2)   FIQIRQ有高的优先级,优先处理FIQ

 

  1. #define    GLOBAL_CLK             1  
  2.   
  3. #include <stdlib.h>  
  4.   
  5. #include <string.h>  
  6.   
  7. #include "def.h"  
  8.   
  9. #include "option.h"  
  10.   
  11. #include "2440addr.h"  
  12.   
  13. #include "2440lib.h"  
  14.   
  15. #include "2440slib.h"  
  16.   
  17. #include "mmu.h"  
  18.   
  19. #include "profile.h"  
  20.   
  21. #include "memtest.h"  
  22.   
  23.    
  24.   
  25. void key_init(void);  
  26.   
  27. static void __irq key_handler(void);  
  28.   
  29. void beep_init(void);  
  30.   
  31. void beep_run(void);  
  32.   
  33. /*************************************************  
  34.   
  35. Function name: delay  
  36.   
  37. Parameter    : times  
  38.   
  39. Description     : 延时函数  
  40.   
  41. Return            : void  
  42.   
  43. Argument     : void  
  44.   
  45. Autor & date : Daniel  
  46.   
  47. **************************************************/  
  48.   
  49. void delay(int times)  
  50.   
  51. {  
  52.   
  53.     int i,j;  
  54.   
  55.     for(i=0;i<times;i++)  
  56.   
  57.        for(j=0;j<400;j++);  
  58.   
  59. }  
  60.   
  61. /*************************************************  
  62.   
  63. Function name: Main  
  64.   
  65. Parameter    : void  
  66.   
  67. Description     : 主功能函数  
  68.   
  69. Return            : void  
  70.   
  71. Argument     : void  
  72.   
  73. Autor & date : Daniel  
  74.   
  75. **************************************************/  
  76.   
  77. void Main(void)  
  78.   
  79. {       
  80.   
  81.    beep_init();//设置对应端口为输出  
  82.   
  83.    MMU_Init(); //  
  84.   
  85.    key_init();  
  86.   
  87.    while(1);  
  88.   
  89.          
  90.   
  91. }       
  92.   
  93.    
  94.   
  95. /*************************************************  
  96.   
  97. Function name: key_init()  
  98.   
  99. Parameter    : void  
  100.   
  101. Description     : 按键K1的初始化函数  
  102.   
  103. Return            : void  
  104.   
  105. Argument     : void  
  106.   
  107. Autor & date : Daniel  
  108.   
  109. **************************************************/  
  110.   
  111. void key_init(void)  
  112.   
  113. {  
  114.   
  115.     rGPGCON &= ~(0x3<<0);     /*set eint8 as interrupt*/  
  116.   
  117.     rGPGCON |=  (0x2<<0);  
  118.   
  119.       
  120.   
  121.     rEXTINT1 &= ~(0xf<<0);   /*set eint8 with low level*/  
  122.   
  123.     rEINTPEND |= (1<<8);  //写1清EINT8中断  
  124.   
  125.     rEINTMASK &= ~(1<<8); //使能中断不屏蔽  
  126.   
  127.       
  128.   
  129.     /*设置ISR*/  
  130.   
  131.     pISR_EINT8_23=(U32)key_handler;  
  132.   
  133.     EnableIrq(BIT_EINT8_23); //8-23共用一个中断号  
  134.   
  135. }      
  136.   
  137.    
  138.   
  139. /*************************************************  
  140.   
  141. Function name: key_handler()  
  142.   
  143. Parameter    : void  
  144.   
  145. Description     : 按键K1的中断服务子程序  
  146.   
  147. Return            : void  
  148.   
  149. Argument     : void  
  150.   
  151. Autor & date : Daniel  
  152.   
  153. **************************************************/  
  154.   
  155. static void __irq key_handler(void)  
  156.   
  157. {  
  158.   
  159.        /*判断是否是按键K1产生的中断*/  
  160.   
  161.     if(rINTPND==BIT_EINT8_23) //rINTPND判断中断是否被响应,1响应;0不响应  
  162.   
  163.     {  
  164.   
  165.               ClearPending(BIT_EINT8_23);  
  166.   
  167.               if(rEINTPEND&(1<<8))//外部中断相应位来判断对应寄存器是否发生中断,EINT8是否发生中断  
  168.   
  169.               {  
  170.   
  171.                      rEINTPEND |= 1<< 8;//清中断EINT8  
  172.   
  173.                      beep_run();  
  174.   
  175.               }  
  176.   
  177.        }  
  178.   
  179. }  
  180.   
  181. /*************************************************  
  182.   
  183. Function name: beep_init()  
  184.   
  185. Parameter    : void  
  186.   
  187. Description     : 初始化蜂鸣器  
  188.   
  189. Return            : void  
  190.   
  191. Argument     : void  
  192.   
  193. Autor & date : Daniel  
  194.   
  195. **************************************************/  
  196.   
  197. void beep_init(void)//设置IO为输出  
  198.   
  199. {  
  200.   
  201.     rGPBCON &= ~(0x3<<0);  
  202.   
  203.     rGPBCON |=  (0x1<<0);  
  204.   
  205. }  
  206.   
  207. /*************************************************  
  208.   
  209. Function name: beep_run()  
  210.   
  211. Parameter    : void  
  212.   
  213. Description     : 运行蜂鸣器  
  214.   
  215. Return            : void  
  216.   
  217. Argument     : void  
  218.   
  219. Autor & date : Daniel  
  220.   
  221. **************************************************/  
  222.   
  223. void beep_run(void)  
  224.   
  225. {  
  226.   
  227.     rGPBDAT |= (0x1<<0);  
  228.   
  229.     delay(50);  
  230.   
  231.     rGPBDAT &= (0x0<<0);  
  232.   
  233.     delay(50);  
  234.   
  235. }  
#define    GLOBAL_CLK             1

#include <stdlib.h>

#include <string.h>

#include "def.h"

#include "option.h"

#include "2440addr.h"

#include "2440lib.h"

#include "2440slib.h"

#include "mmu.h"

#include "profile.h"

#include "memtest.h"

 

void key_init(void);

static void __irq key_handler(void);

void beep_init(void);

void beep_run(void);

/*************************************************

Function name: delay

Parameter    : times

Description     : 延时函数

Return            : void

Argument     : void

Autor & date : Daniel

**************************************************/

void delay(int times)

{

    int i,j;

    for(i=0;i<times;i++)

       for(j=0;j<400;j++);

}

/*************************************************

Function name: Main

Parameter    : void

Description     : 主功能函数

Return            : void

Argument     : void

Autor & date : Daniel

**************************************************/

void Main(void)

{     

   beep_init();//设置对应端口为输出

   MMU_Init(); //

   key_init();

   while(1);

       

}     

 

/*************************************************

Function name: key_init()

Parameter    : void

Description     : 按键K1的初始化函数

Return            : void

Argument     : void

Autor & date : Daniel

**************************************************/

void key_init(void)

{

    rGPGCON &= ~(0x3<<0);     /*set eint8 as interrupt*/

    rGPGCON |=  (0x2<<0);

    

    rEXTINT1 &= ~(0xf<<0);   /*set eint8 with low level*/

    rEINTPEND |= (1<<8);  //写1清EINT8中断

    rEINTMASK &= ~(1<<8); //使能中断不屏蔽

    

    /*设置ISR*/

    pISR_EINT8_23=(U32)key_handler;

    EnableIrq(BIT_EINT8_23); //8-23共用一个中断号

}    

 

/*************************************************

Function name: key_handler()

Parameter    : void

Description     : 按键K1的中断服务子程序

Return            : void

Argument     : void

Autor & date : Daniel

**************************************************/

static void __irq key_handler(void)

{

       /*判断是否是按键K1产生的中断*/

    if(rINTPND==BIT_EINT8_23) //rINTPND判断中断是否被响应,1响应;0不响应

    {

              ClearPending(BIT_EINT8_23);

              if(rEINTPEND&(1<<8))//外部中断相应位来判断对应寄存器是否发生中断,EINT8是否发生中断

              {

                     rEINTPEND |= 1<< 8;//清中断EINT8

                     beep_run();

              }

       }

}

/*************************************************

Function name: beep_init()

Parameter    : void

Description     : 初始化蜂鸣器

Return            : void

Argument     : void

Autor & date : Daniel

**************************************************/

void beep_init(void)//设置IO为输出

{

    rGPBCON &= ~(0x3<<0);

    rGPBCON |=  (0x1<<0);

}

/*************************************************

Function name: beep_run()

Parameter    : void

Description     : 运行蜂鸣器

Return            : void

Argument     : void

Autor & date : Daniel

**************************************************/

void beep_run(void)

{

    rGPBDAT |= (0x1<<0);

    delay(50);

    rGPBDAT &= (0x0<<0);

    delay(50);

}

/******************************************************************************

重点分析:

******************************************************************************/

中断控制程序分析:

 

按键作为中断源

/*************************************************

Function name: key_init()

Parameter   : void

Description  :按键K1的初始化函数

Return         : void

Argument    : void

Autor & date : Daniel

**************************************************/

void key_init(void)

{

    rGPGCON &= ~(0x3<<0);     /*set eint8 as interrupt*/

    rGPGCON |=  (0x2<<0);

   

    rEXTINT1 &= ~(0xf<<0);   /*外部中断控制寄存器set eint8 with low level*/

    rEINTPEND |= (1<<8);    /*外部中断待定寄存器*/

    rEINTMASK &= ~(1<<8);   /*外部中断屏蔽寄存器*/

   

    /*设置ISR*/

    pISR_EINT8_23=(U32)key_handler; //按键按下就会执行相应的中断函数

    EnableIrq(BIT_EINT8_23);          //使能相应中断

}   

 

<>.GPGCON0作为中断引脚

<>.EXTINT1外部中断寄存器1低四位设置全为0;低电平触发中断;

<>.EINTPEND8位清中断;判断中断源是否发生;

<>EINTMASK8位设为0,不屏蔽中断

 

/*************************************************

Function name: key_handler()

Parameter   : void

Description  :按键K1的中断服务子程序

Return         : void

Argument    : void

Autor & date : Daniel

**************************************************/

static void __irq key_handler(void)

{

       /*判断是否是按键K1产生的中断*/

    if(rINTPND==BIT_EINT8_23)

    {

             ClearPending(BIT_EINT8_23);  //进入中断处理函数第一件事就是清中断,如果不清中断无法产生下次中断

             if(rEINTPEND&(1<<8))

             {

                    rEINTPEND |= 1<< 8;

                    beep_run();

             }

       }

}

 

转自: http://blog.csdn.net/yx_l128125/article/details/7697280
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mini2440按键中断 的相关文章

  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 将 GCC 内联汇编与采用立即值的指令结合使用

    问题 我正在为 ARM Cortex M3 处理器开发定制操作系统 为了与我的内核交互 用户线程必须生成 SuperVisor Call SVC 指令 以前称为 SWI 用于软件中断 该指令在ARM ARM中的定义是 这意味着该指令需要即时
  • C 嵌入式应用程序中 time() 函数的问题

    我在用time 在 ARM 微控制器上 处理器一到达此函数就会重新启动 奇怪的是 当我处于调试模式时 代码运行得很好 但一旦我想将其应用到独立模式 我就会遇到重置 我是否忽略了什么 这个功能有替代品吗 代码部分是这样的 include
  • 为 ARM 交叉编译 zlib

    我尝试为arm poky linux gnueabi交叉编译zlib 但启动 make 时出现错误 zlib 1 2 11 AR HOST ar CC HOST gcc RANLIB HOST ranlib configure prefix
  • 如何在 Android 设备上运行 VS Code [重复]

    这个问题在这里已经有答案了 我有 Galaxy Tab S6 它具有替代笔记本电脑的很酷的功能 例如连接鼠标和键盘 但不幸的是它运行 Android 操作系统 并且没有很多开发应用程序可用于 Android 所以我想是否有一个选项可以在至少
  • 尝试使用 qemu-arm 运行arm二进制文件时如何解决“加载共享库时出错”?

    我正在运行 Linux Mint 14 并安装了 qemu qemu user 和 gnueabi 工具链 我编译了 test carm linux gnueabi gcc test c o test 当我尝试跑步时qemu arm usr
  • 交叉编译 Qt 4.7 时出现“非法指令”

    我已经在这个问题上苦苦挣扎了一个多星期了 但仍然找不到解决方案 我正在尝试为 ARM 设备交叉编译 Qt 4 7 嵌入式开源版本 构建过程本身可以顺利完成 但生成的二进制文件似乎包含处理器无法理解的指令 构建主机是 i386 上的 Debi
  • 如何使用 Neon SIMD 将无符号字符转换为有符号整数

    如何转换变量的数据类型uint8 t to int32 t使用霓虹灯 我找不到执行此操作的任何内在因素 假设您想要将 16 x 8 位整数的向量转换为 4 个 4 x 32 位整数的向量 您可以通过首先解压缩为 16 位 然后再次解压缩为
  • 使用 Android NDK 使用 -fsigned-char 进行构建安全吗?

    为了与其他平台保持一致 我需要使用signed char在我正在处理的一些本机代码中 但默认情况下在Android NDK上char类型是unsigned 我尝试明确使用signed char类型 但它生成太多警告differ in sig
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 了解 U-Boot 内存占用

    我不明白加载 U Boot 时 RAM 中发生了什么 我正在开发 Xilinx Zynq ZC702 评估套件 并尝试使用 U Boot 在其上加载 Linux 内核 于是我使用Xilinx工具Vivado和SDK生成了一个BOOT bin
  • AOSP 的“午餐”组合是什么意思?我需要选择什么?

    我是 Android 设备 ROM 开发的新手 无论如何 我现在正在为具有 64 位处理器的中国设备构建 AOSP 我按照 source android com 上的菜单进行操作 当我运行 午餐 命令时 终端显示 午餐菜单 选择一个组合 我
  • 为什么 GCC 交叉编译不构建“crti.o”?

    在尝试为arm构建gcc 4 x x交叉编译器时 我陷入了缺失的困境crti o文件在 BUILD DIR gcc子目录 An strace在顶层Makefile表明编译后的xgcc正在调用交联器ld with crti o 作为一个论点
  • 使用 NEON 内在函数除以浮点数

    我当时正在处理四个像素的图像 这是在armv7对于 Android 应用程序 我想分一个float32x4 t向量由另一个向量组成 但其中的数字与大约不同0 7 to 3 85 在我看来 除法的唯一方法是使用右移 但这是针对一个数字2 n
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • 直接写入 ARM Cortex A8 分支预测器中的全局历史缓冲区 (GHB) 或 BTB?

    我有兴趣直接修改 Cortex A8 上的 BTB 分支目标缓冲区 和 GHB 的内容 ARM 手册上有这样的内容 要在指令端 GHB 数组中写入一项 例如 LDR R0 0x3333AAAA MCR p15 0 R0 c15 c1 0 M
  • 什么是 .axf 文件?

    我是arm架构的新手 我从事嵌入式软件工作 并试图了解我的项目二进制文件的调试文件夹中存在的 axf文件 发现它是链接器在构建过程中生成的arm可执行格式文件 用于调试崩溃 所以很明显它包含了一些调试信息 但不清楚具体是什么信息 而且deb
  • 如何在 Linux 内核中定义并触发我自己的新软中断?

    我想在 Linux 内核中创建自己的软中断 这是正确的方法吗 In the init我想触发该模块的softirq我将添加一个调用 394 void open softirq int nr void action struct softir

随机推荐

  • 运算放大器分类及运算放大器参数说明

    运算放大器 我们在大部分情况下只了解运放简单的电路模型 而在很多场景中 并不是任何放大器都可以被直接拿过来应用 而是需要更加深入的了解运放的性能 那什么是性能呢 就是运放本身的参数 只有选择符合要求的运放 我们才能放大我们想要的信号 滤除我
  • 生命在于折腾——Obsidian笔记软件折腾记录(一)

    一 开端 我使用过很多笔记软件 OneNote 语雀 Notability GoodNotes 印象笔记 有道云笔记 不得不说 我一直想拥有一款满足以下条件的笔记软件 买断制 符合以下所有条件我考虑订阅 ipad可手写 icloud可同步
  • Cocos2dx——戏如人生(1)

    建立工程 cocos new game3 1 com cn wang l cpp d project 本人用的是cocos2dx 3 6 运行工程 Hello world helloworldscene h ifndef HELLOWORL
  • 使用DVWA进行XSS漏洞实战

    使用DVWA进行XSS漏洞实战 本文记录使用DVWA进行XSS漏洞实战的过程 跨站脚本 Cross Site Scripting XSS 是一种经常出现在 WEB 应用程序中的计算机安全漏洞 是由于 WEB 应用程序对用户的输入过滤不足而产
  • 区块链与分布式数据库的区别

    1 来源 分布式数据库 应对互联网条件下大规模数据的增删改查需求 解决传统数据库面临的通信开销大 性能差 容量可扩展性差和可靠性低的问题 通信开销大 假设只有一个数据库 并且放在北京 那么纽约的用户就需要等待网络从纽约到北京的往返通信延迟
  • 使用python写一个爬取百度前10条热搜

    import requests from bs4 import BeautifulSoup def get baidu hot url https top baidu com board tab realtime headers User
  • 宝塔面板如何部署静态网站?一分钟教会你最简单的方法

    宝塔面板如何部署静态网站 如果你有做好的静态网站源码 想要直接上传到宝塔面板 有的朋友可能不知道放在哪里 这里教大家一个最简单的方法 首先 一键部署好你的网站 这里用WordPress一键部署来举例 填写好你的网站信息 保存好数据库名和密码
  • 神经网络的过拟合是什么,神经网络过拟合的表现

    神经网络过拟合的现象是什么 发生原因 过拟合现象一般都是因为学习的过于精确 就好比让机器学习人脸 取了100个人的脸训练 但是由于你学习的过精确 导致除了这个样本100人外其他的人脸神经网络都认为不是人脸 实际我们只需要学习人脸的基本特征而
  • lstm时间序列预测+GRU(python)

    lstm时间序列预测 GRU python 1 数据分布 2 完整代码 3 实验结果 4 相关代码 4 1 GRU的修改 4 2 BiLSTM的修改 可以参考新发布的文章 1 BP神经网络预测 python 2 mlp多层感知机预测 pyt
  • 1、muduo网络库 ---- Linux平台下muduo编译安装

    muduo库的介绍 一个基于reactor反应堆模型的多线程C 网络库 作者是陈硕大神 muduo库是基于 boost 库开发的 所以需要在 Linux 平台上首先安装 boost 库 1 boost 库安装 1 编译源码安装 第一种方法是
  • Linux Nginx 配置 Thinkphp 两种方式

    第一种常见 前端vue后端Thinkphp接口以 api开头 这种Thinkphp不用启动 但是需要启动 php pfm 遇到的问题是我多个Thinkphp 项目在不同的目录 配置也是对应目录 但是不同域名访问接口 时都指向了第一个Thin
  • MQ--3 Message queuing)>>>>kafka

    MQ 1 Message queuing gt gt gt gt RabbitMQ MQ 2 Message queuing gt gt gt gt ZooKeeper 三 Kafka http kafka apache org 官网链接
  • windows的磁盘操作之二——初始化磁盘

    转载自 windows的磁盘操作之二 初始化磁盘 bunny技术坊的技术博客 51CTO博客 原文如下 上一节中我们介绍了一些基本概念和主要的API 本节开始我们将列举并分析一些实例 本文中的所有代码我都在vs2008下测试过 读者只需要替
  • Flutter使用C++

    总体 flutter通过dart语言和C 交互 dart的ffi包完成交互 ffi封装了c 的基本数据类型 包括结构体 和一些基本方法 我们可以直接在dart中访问c 的内存数据等 相对于jni更加直接 基本步骤 官方步骤 https do
  • 数据挖掘七种常用的方法汇总

    数据挖掘 Data Mining 就是从大量的 不完全的 有噪声的 模糊的 随机的实际应用数据中 提取隐含在其中的 人们事先不知道的 但又是潜在有用的信息和知识的过程 这个定义包括几层含义 数据源必须是真实的 大量的 含噪声的 发现的是用户
  • 将本地jar 批量发布到 Nexus 私服

    前言 在日常开发过程中 我们有遇到将项目依赖通过 mvn deploy 发布到自己的公司的私服 以便其他人 环境统一下载入口 但是也有一些特殊情况 比如只能拿到第三方 或甲方 的依赖jar 并拿不到源码 所以只能将jar 通过 mvn de
  • 有限域GF(2^8)内乘法代码实现以及原理

    在密码学中经常用到有限域的乘法 一般在AES中用到的是GF 2 8 有限域内乘法 什么是有限域呢 有限域通俗的讲就是函数的运算结果全都包含在一个域中 不同于实数域 有限域有一个最大值 所有超过这个最大值的数都会经过一定的方法使他回到这个域中
  • 主成份分析(PCA)详解

    主成分分析法 Principal Component Analysis 大多在数据维度比较高的时候 用来减少数据维度 因而加快模型训练速度 另外也有些用途 比如图片压缩 主要是用SVD 也可以用PCA来做 因子分析等 具体怎么用 看个人需求
  • Docker基础(1)—— Docker基本概念

    Docker基础 1 Docker基本概念 Docker基础 2 Docker安装及基础操作 关于docker是什么以及docker的教程网上有很多资料 GitBook上的Docker教程是比较官方和全面的 以下我结合手册的学习及在慕课网上
  • mini2440按键中断

    ARM中断控制系统 按键驱动程序设计 一 Arm中断控制系统 1 查询方式 程序不断地查询设备的状态 并做出相应的反应 该方式实现比较简单 常用在比较单一的系统中 比如 一个温控系统中可以实用查询的方式不断检测温度变化 特点 实现简单 但C