unsigned

ARM裸机开发(二)中断编程

青春壹個敷衍的年華 提交于 2020-01-22 20:52:48
以下裸机程序基于GT2440,编译器为arm-linux-gcc-4.4.3。 程序布局:源代码由interrupt.S和led.c两个文件组成,interrupt负责初始化工作,led.c里定义了中断处理程序。 程序流程:首先安装异常向量表,在复位异常里关闭看门狗,然后进入普通中断模式,设置普通中断的栈指针(为C语言写的中断处理程序做准备),接着设为特权模式,初始化中断(设置IO管脚,开启中断),最后CPU一直死循环等待外部中断触发。当外部中断到来时,先保护现场,跳到led.c里的handle_irp()函数,在该函数里将四个LED点亮,接着返回,最后恢复现场,返回到死循环。 interrupt.S: 1 //寄存器物理地址宏定义 2 #define WTCON 0x53000000 3 4 #define GPFCON 0x56000050 5 #define nGPF_INT2 (0x02<<4) 6 #define nGPF_INT0 (0x02<<0) 7 #define EXINT0 0x56000088 8 9 #define SRCPND 0X4A000000 10 #define INTMOD 0X4A000004 11 #define INTMSK 0x4A000008 12 #define PRIORITY 0x4A00000C 13 #define

使用FAAC实现PCM转AAC

大城市里の小女人 提交于 2020-01-22 18:47:38
一、前言 AAC全称为Advanced Audio Coding,目前比较主流的AAC开源编码器主要有Nero和Faac。接下来我们将使用Faac实现音频PCM至AAC的音频格式转换,并使用Emscripten编译成WebAssembly模块。 二、实现步骤 使用Faac实现音频编码,主要有以下步骤: 2.1 主要函数 faacEncOpen faacEncHandle FAACAPI faacEncOpen ( unsigned long sampleRate , unsigned int numChannels , unsigned long * inputSamples , unsigned long * maxOutputBytes ) ; 变量名 变量含义 sampleRate 输入PCM的采样率。 numChannels 输入PCM的通道数。 inputSamples 编码一帧AAC所需要的字节数,打开编码器后获取,故声明时不需赋值。 maxOutputBytes 编码后的数据输出的最大长度。 faacEncEncode int FAACAPI faacEncEncode ( faacEncHandle hEncoder , int32_t * inputBuffer , unsigned int samplesInput , unsigned char *

linux 块设备驱动(二)——块设备数据结构

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-22 13:27:29
本文来源于: 1 . http://www.cnblogs.com/dyllove98/archive/2013/07/01/3165567.html 块设备相关的数据结构以及接口: 块设备接口则相对复杂,读写API没有直接到块设备层,而是直接到文件系统层,然后再由文件系统层发起读写请求。 一: block_device: block_device结构代表了内核中的一个块设备。它可以表示整个磁盘或一个特定的分区。当这个结构代表一个分区时,它的bd_contains成员指向包含这个分区的设备,bd_part成员指向设备的分区结构。当这个结构代表一个块设备时,bd_disk成员指向设备的gendisk结构。 struct block_device { dev_t bd_dev; struct inode * bd_inode; /*分区结点*/ int bd_openers; struct semaphore bd_sem; /*打开/关闭锁*/ struct semaphore bd_mount_sem; /* 加载互斥锁*/ struct list_head bd_inodes; void * bd_holder; int bd_holders; struct block_device * bd_contains; unsigned bd_block_size;//分区块大小

读书笔记:《C++大学教程》第六章:函数和递归入门(2)

无人久伴 提交于 2020-01-22 06:46:00
读书笔记:《C++大学教程》第六章:函数和递归入门(2) 1.引用和引用形参 1.1函数的参数传递分为两种 按值传递:函数结束后自动销毁,不改变传入实参的值。 按引用传递:在形参类型后加个&,不用返回便可修改传入实参的值。 1.2引用变量必须在它们的声明中完成初始化,并且不能在指定为其他变量的别名. 1.3从函数返回引用:虚悬引用 2.默认实参 2.1.代码实现 unsigned int testFun ( unsigned int a = 1 , unsigned int b = 1 , unsigned int c = 1 ) ; testFun ( ) ; testFun ( 2 , 2 ) ; testFun ( 3 , 3 , 3 ) ; //均合法 3.一元的作用域分辨符 3.1.代码 int number = 7 ; int main ( ) { int number = 10 ; cout << number ; //10 cout << :: number ; //7,使用全局 } 3.2.解释 在局部变量的作用域中使用全局变量 4.函数重载 4.1.代码 int square ( int x ) ; //1 double square ( double y ) ; //2 square ( 7 ) ; //调用函数原型1 square ( 1.4 ) ; /

逆向入门笔记之分析TraceMe.exe

耗尽温柔 提交于 2020-01-21 00:10:49
TraceMe.exe 是一个示例程序,用于逆向的学习,简单地模拟了注册机制。 我们把它拖进IDA中无脑F5一波: 双击DialogFunc进入这个函数: BOOL __stdcall DialogFunc(HWND hWnd, UINT a2, WPARAM a3, LPARAM a4) { int v5; // ebx HWND v6; // eax HWND v7; // eax HWND v8; // eax HICON v9; // eax CHAR String2[4]; // [esp+8h] [ebp-F4h] int v11; // [esp+Ch] [ebp-F0h] int v12; // [esp+10h] [ebp-ECh] __int16 v13; // [esp+14h] [ebp-E8h] char v14; // [esp+16h] [ebp-E6h] CHAR v15; // [esp+18h] [ebp-E4h] char v16; // [esp+2Eh] [ebp-CEh] CHAR v17; // [esp+30h] [ebp-CCh] __int16 v18; // [esp+44h] [ebp-B8h] char v19; // [esp+46h] [ebp-B6h] CHAR String; // [esp+48h] [ebp

MSP430F5529实现LED1无极调光

余生颓废 提交于 2020-01-20 20:35:14
概述 使用TA0的比较模式输出方波,驱动LED1. 方波的频率较小时用相机拍摄LED时会发现在闪烁,为了让相机不能发现LED在闪烁,使用25MHz的时钟源。通过DCO-FLL得到。 机械按键会抖动,使用TA1定时扫描按键,消除抖动。 英文注释部分是code example经过修改的 代码 # include <msp430.h> void SetVcoreUp ( unsigned int level ) ; int main ( void ) { WDTCTL = WDTPW + WDTHOLD ; //关闭看门狗 P1DIR & = ~ BIT1 ; //把P1.1配置为输入。 P1REN | = BIT1 ; //启用上/下拉电阻 P1OUT | = BIT1 ; //使用上拉电阻 P2DIR & = ~ BIT1 ; //把P2.1配置为输入。 P2REN | = BIT1 ; //启用上/下拉电阻 P2OUT | = BIT1 ; //使用上拉电阻 // Increase Vcore setting to level3 to support fsystem=25MHz // NOTE: Change core voltage one level at a time.. SetVcoreUp ( 0x01 ) ; SetVcoreUp ( 0x02 ) ;

unsigned int vs. size_t

爷,独闯天下 提交于 2020-01-20 13:35:37
我注意到现代 C 和C ++代码似乎在任何地方使用 size_t 而不是 int / unsigned int - 从C字符串函数的参数到STL。 我很好奇这个原因及其带来的好处。 #1楼 size_t 类型是无符号整数类型,它是 sizeof 运算符(和 offsetof 运算符)的结果,因此保证它足够大以包含系统可以处理的最大对象的大小(例如,静态数组8GB)。 size_t 类型可能大于,等于或小于 unsigned int ,并且您的编译器可能会对其进行假设以进行优化。 您可以在C99标准中找到更准确的信息,第7.17节,其草案可在因特网上以 pdf 格式或在C11标准第7.19节中获得,也可作为 pdf草案获得 。 #2楼 类型size_t必须足够大,以存储任何可能对象的大小。 Unsigned int不必满足该条件。 例如,在64位系统中int和unsigned int可能是32位宽,但size_t必须足够大以存储大于4G的数字 #3楼 经典C(由Brian Kernighan和Dennis Ritchie在C编程语言中描述的C的早期方言,Prentice-Hall,1978)没有提供 size_t 。 C标准委员会引入 size_t 来消除可移植性问题 在embedded.com上详细解释(有一个很好的例子) #4楼 size_t类型是sizeof运算符返回的类型。

关于size_t与size_type

余生长醉 提交于 2020-01-20 10:21:55
整理自 关于size_t与size_type 问题起源于这样一段代码: #include <algorithm> #include <stdio.h> int main() { size_t indexs = -1; size_t ps = 100; int index = -1; int p = 100; printf("%d\n",std::min(p,index)); printf("%d\n",std::min(ps,indexs)); return 0; } 其实是很简单的题目,不过要对size_t类型有一个了解才行。 关于size_t的来源: 数据类型"socklen_t"和int应该具有相同的长度。否则就会破坏BSD套接字层的填充.POSIX开始的时候用的是size_t, Linus Torvalds(他希望有更多的人,但显然不是很多) 努力向他们解释使用size_t是完全错误的,因为在64位结构中 size_t和int的长度是不一样的,而这个参数(也就是accept函数的第三参数)的长度必须和int一致,因为这是BSD套接字接口标准.最终POSIX的那帮家伙找到了解决的办法,那就是创造了一个新的类型"socklen_t".Linux Torvalds说这是由于他们发现了自己的错误但又不好意思向大家伙儿承认,所以另外创造了一个新的数据类型 。 size

size_type 和 size_t 的区别

微笑、不失礼 提交于 2020-01-20 00:35:39
标准库string里面有个函数size,用来返回字符串中的字符个数,具体用法如下: string st("The expense of spirit\n"); cout << "The size of "<<st<<"is"<<st.size() << "characters, including the newline"<<endl; 那么size()这个函数返回的类型到底是什么呢?一定要记住,绝对不是整形,而是size_type类型的,所以千万不要把size的返回值赋给一个int变量。 那么size_type到底是一种什么样的类型呢? string类类型和许多其他库类型都定义了一些配套类型(companion type)。通过这些配套类型,库类型的使用就能与机器无关。size_type就是这些配套类型中的一种。 size_type被定义为与unsigned型(unsigned int, unsigned long)具有相同的含义,而且可以保证足够大能够存储任意string对象的长度。为而来使用由string类型定义的size_type类型。程序员必须加上作用于操作符来说明所使用的size_type类型是由string类定义的。 我们为什么不适用int变量来保存string的size呢? 使用int变量的问题是:有些机器上的int变量的表示范围太小

【算法】MD5加密

做~自己de王妃 提交于 2020-01-19 06:03:47
1.什么是MD5 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。——百度百科 MD5其实不算是加密算法,而是一种信息的摘要。它的特性是不可逆的,所以除了暴力破解 一般逆序算法是得不到结果的。例如:使用如下算法进行加密,对一个字符串利用它的长度和每一位的ASCII相加得出值,比如“bc”那么就是2+98+99=199,如果利用这个算法进行逆推的得出的答案就不唯一,比如"ac",“Ho”,"AAB"等等。 2.MD5加盐 如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码。 加Salt可以一定程度上解决这一问题。所谓加Salt方法,就是加点“佐料”。其基本想法是这样的:当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“佐料”,然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的“佐料”,然后散列,再比较散列值,已确定密码是否正确。 3.MD5的加密步骤 接下来大致罗列一下MD5加密的计算步骤,可以参考这个视频, MD5算法视频 1、数据填充