unsigned

bullet中的内存池

空扰寡人 提交于 2020-02-26 22:08:56
1。概念(见于Baidu)  内存池(Memory Pool)是一种内存分配方式。 通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。  内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升。 2.Bullet内存池(btPoolAllocator.h ) 内存池可以是反复的new delete更有效率,而且很有效的避免了内存碎片。btPoocclAllocator提供了一个简单的内存池,包括初始化分配足够数量的内存,申请内存等常用的方法。这个内存池比较好用于反复分配释放同一个对象,初始化了N*size(object)大小的内存,每次分配大小是一个Object。 1 class btPoocclAllocator 2 { 3 int m_elemSize; //每个对象的大小 4 int m_maxElements;//最大容量 5 int m_freeCount;//剩余的个数 6 void* m_firstFree;//每次分配的起点 7 unsigned char* m_pool; /

以命令行的格式读取音频文件信息,并将读取的内容写到输出文件中

╄→гoц情女王★ 提交于 2020-02-26 13:56:15
文章目录 c语言实现代码 运行结果 总结: 输入: wavinfo -i xxx.wav -o output.txt 输出:(格式规范)xxx=yyy rate(Hz)=16000 length=32000 ch=2 depth(bit)=16 c语言实现代码 ////命令行输入参数,读取wav文件的信息 # include <stdio.h> # include <stdint.h> /*struct类型里面我用的是uint32_t等类型,而不是传统的int,short等等 这些类型是由stdint.h头文件提供*/ # include <stdlib.h> # include <windows.h> typedef struct wave_tag //声明结构体的相关参数 { char ChunkID [ 4 ] ; // "RIFF"标志 unsigned int ChunkSize ; // 文件长度(WAVE文件的大小, 不含前8个字节) char Format [ 4 ] ; // "WAVE"标志 char SubChunk1ID [ 4 ] ; // "fmt "标志 unsigned long int SubChunk1Size ; // 过渡字节(不定) unsigned short int AudioFormat ; // 格式类别

RC4加密

荒凉一梦 提交于 2020-02-26 02:35:13
介绍 在密码学 中 , RC4 (Rivest Cipher 4,也称为 ARC4 或 ARCFOUR, 意为所谓的RC4)是一种 流密码 。 尽管它以简单性和软件速度着称,但在RC4中发现了多个漏洞,使其不安全。 当 不丢弃 输出 密钥流 的开头 或使用非随机或相关密钥 时,它特别容易受到攻击 。 RC4的使用特别有问题,导致 协议 非常不安全, 例如 WEP。 参数介绍 参数名 说明 S S-box,长度为256的char型数组,char S[256] K 密钥Key,用户自定义,长度在1~256,用来打乱S-box T 临时变量,长度为256的char型数组 D 保存加密前/后数据 基本流程 初始化 S 和 T 数组。 初始化置换 S。 生成密钥流。 初始化S和T数组+初始化置换S void RC4_Init(unsigned char* S, unsigned char* K, unsigned int len) { int i, j = 0; unsigned char ch_tmp, T[256] = { 0 };//临时变量 for (i = 0; i < 256; ++i) { S[i] = i;//初始化S-box T[i] = K[i % len];//密钥填充临时数组 } //打乱S-box for (i = 0; i < 256; ++i) { j = (j

Atmel studio注意事项

微笑、不失礼 提交于 2020-02-24 13:40:17
注意事项整理如下: 1) MCU必须的头文件 Atmel Studio 6 (以下简称AS6)中统一用 #include <avr/io.h> 。这点很重要,AS6把atmel 所有的单片机头文件全都集成在一起了,以后不必再去分具体的每种芯片的头文件了 2) 汇编嵌入 在AS6 中,你可以直接使用 asm("xxx") 格式.或者用小写的 sei(); 这个其实是很爽的, 最常用的就是中断控制,使用比较方便。 3) 延时函数 在AS6中,只需要加载一个头文件 #include <util/delay.h> ,就可以使用两个标准的延时函数,分别是 _delay_ms(double __ms) 和 _delay_us(double __us),虽然参数为double型, 但可赋整型值。 注意在调用前在 delay.h 前面 定义 #define F_CPU 8000000UL(这里以8000000UL为例,实际系统频率为准),如下图, 这样延时10ms 的函数写为_delay_ms(10),经过试用,只要晶振填写准确,这两个延时函数很准确。 但是不建议修改头文件,而是在项目属性里面去定义这个宏!但是不建议修改头文件,而是在项目属性里面去定义这个宏!但是不建议修改头文件,而是在项目属性里面去定义这个宏! 4) 中断函数 在AS6中,需加载头文件 #include <avr

uboot启动原理

半腔热情 提交于 2020-02-24 09:04:26
  1.裸机运行程序时一般情况下程序代码小于16KB将其下载地址设置到BL1的起始地址。BL0会自动加载并执行BL1。 当程序大于16kB时无法直接运行。   例如UBOOT就大于16KB,执行的原理为。将程序分为BL1、BL2两部分。 其中BL1初始化DDR并且指定BL2的起始地址。BL2为真正需要的程序。 BL1部分 start.S #define WTCON 0xE2700000 #define SVC_STACK 0xd0037d80 .global _start // 把_start链接属性改为外部,这样其他文件就可以看见_start了 _start: // 第1步:关看门狗(向WTCON的bit5写入0即可) ldr r0, =WTCON ldr r1, =0x0 str r1, [r0] // 第2步:设置SVC栈 ldr sp, =SVC_STACK // 第3步:开/关icache mrc p15,0,r0,c1,c0,0; // 读出cp15的c1到r0中 //bic r0, r0, #(1<<12) // bit12 置0 关icache orr r0, r0, #(1<<12) // bit12 置1 开icache mcr p15,0,r0,c1,c0,0; // 第4步:初始化ddr bl sdram_asm_init // 第5步:重定位

Linux中断管理 (3)workqueue工作队列

ぐ巨炮叔叔 提交于 2020-02-22 18:30:53
目录: 《 Linux中断管理 》 《 Linux中断管理 (1)Linux中断管理机制 》 《 Linux中断管理 (2)软中断和tasklet 》 《 Linux中断管理 (3)workqueue工作队列 》 关键词: GIC、IAR、EOI、SGI/PPI/SPI、中断映射、中断异常向量、中断上下文、内核中断线程、中断注册 。 由于篇幅较大,简单梳理一下内容。 本章主要可以分为三大部分: 讲解硬件背景的 1. ARM中断控制器 。 系统初始化的静态过程:GIC初始化和各中断的中断号映射 2. 硬件中断号和Linux中断号的映射 ;每个中断的注册 5. 注册中断 。 一个中断从产生到执行完毕的动态过程:ARM底层通用部分如何处理 3. ARM底层中断处理 ;GIC部分的处理流程以及上层通用处理部分 4. 高层中断处理 。 这里的高层处理,没有包括下半部。下半部在 Linux中断管理 (2)软中断和tasklet 和 Linux中断管理 (3)workqueue工作队列 中进行介绍。 1. ARM中断控制器 1.1 ARM支持中断类型 ARM GIC-v2支持三种类型的中断: SGI: 软件触发中断(Software Generated Interrupt) ,通常用于多核间通讯,最多支持16个SGI中断,硬件中断号从ID0~ID15。

convert a java.net.InetAddress to a long

自闭症网瘾萝莉.ら 提交于 2020-02-22 05:06:12
问题 I would like to convert a java.net.InetAddress and I fight with the signed / unsigned problems. Such a pain. I read convert from short to byte and viceversa in Java and Why byte b = (byte) 0xFF is equals to integer -1? And as a result came up with: final byte [] pumpeIPAddressRaw = java.net.InetAddress.getByName (pumpeIPAddressName).getAddress (); final long pumpeIPAddress = ((pumpeIPAddressRaw [0] & 0xFF) << (3*8)) + ((pumpeIPAddressRaw [1] & 0xFF) << (2*8)) + ((pumpeIPAddressRaw [2] & 0xFF)

convert a java.net.InetAddress to a long

元气小坏坏 提交于 2020-02-22 05:05:52
问题 I would like to convert a java.net.InetAddress and I fight with the signed / unsigned problems. Such a pain. I read convert from short to byte and viceversa in Java and Why byte b = (byte) 0xFF is equals to integer -1? And as a result came up with: final byte [] pumpeIPAddressRaw = java.net.InetAddress.getByName (pumpeIPAddressName).getAddress (); final long pumpeIPAddress = ((pumpeIPAddressRaw [0] & 0xFF) << (3*8)) + ((pumpeIPAddressRaw [1] & 0xFF) << (2*8)) + ((pumpeIPAddressRaw [2] & 0xFF)

Linux添加系统调用的两种方法

怎甘沉沦 提交于 2020-02-22 04:40:19
前言 系统调用的基本原理 系统调用其实就是函数调用,只不过调用的是内核态的函数,但是我们知道,用户态是不能随意调用内核态的函数的,所以采用软中断的方式从用户态陷入到内核态。在内核中通过软中断0X80,系统会跳转到一个预设好的内核空间地址,它指向了系统调用处理程序( 不要和系统调用服务例程混淆 ),这里指的是在entry.S文件中的system_call函数。就是说,所有的系统调用都会统一跳转到这个地址执行system_call函数,那么system_call函数如何派发它们到各自的服务例程呢? 我们知道每个系统调用都有一个系统调用号。同时,内核中一个有一个system_call_table数组,它是个函数指针数组,每个函数指针都指向了系统调用的服务例程。这个系统调用号是system_call_table的下标,用来指明到底要执行哪个系统调用。当int ox80的软中断执行时,系统调用号会被放进eax寄存器中,system_call函数可以读取eax寄存器获得系统调用号,将其乘以4得到偏移地址,以sys_call_table为基地址,基地址加上偏移地址就是应该执行的系统调用服务例程的地址。 系统调用的传参问题 当一个系统调用的参数个数大于5时(因为5个寄存器(eax, ebx, ecx, edx,esi)已经用完了),执行int 0x80指令时仍需将系统调用功能号保存在寄存器eax中

Linux学习之\"setjmp和longjmp函数\"

▼魔方 西西 提交于 2020-02-21 08:21:46
n setjmp和longjmp函数实现函数之间的跳转(需包含头文件" setjmp.h "): 函数原型: int setjmp(jmp_buf env);      void longjmp(jmp_buf env, int val); setjmp函数用于设置跳转的目的位置,longjmp函数进行跳转。 env:保留了需要返回的位置的堆栈情况。 setjmp的返回值:直接调用该函数,则返回0;若由longjmp的调用,导致setjmp被调用,则返回val (longjmp的第二个参数)。 1.longjmp对各类型参数的影响: 考虑下面这个程序: #include<iostream>#include<setjmp.h>#include<stdlib.h>#include<stdio.h>using namespace std;jmp_buf jmpbuffer;void g(){ cout << "in g()" << endl; longjmp(jmpbuffer, 2);}void f(){ cout << "in f()" << endl; g(); cout << "leave f()" << endl;}int globval;int main(){ int autoval; register int regival; volatile int volaval;