Tag: 内存

在MCU内部FLASH中从一个固件跳转到另一个固件

我目前正在开发针对STM32F030C8的引导加载程序固件应用程序。 我在我的分散文件中指定引导加载程序应用程序将占用主存储器位置0x08000000到0x08002FFF(扇区0到扇区2)。 我还写了一个主要的固件应用程序,存储从0x08003000到0x0800C800。 将两个固件下载到MCU内部FLASH后,我使用以下代码从引导加载程序中激活了主应用程序: /************************************************************//** * \brief Start the main application if available and correct *****************************************************************/ void INTFLASH_execute_main_app(const char mode) { MyFunc_ptr AppEntry; uint32_t temp[1]; IRQn_Type index; memcpy(temp, (void*)&NVIC->ISER, sizeof(NVIC->ISER)); //Save enabled interrupts for( index = (IRQn_Type)0; indexISER, temp, sizeof(NVIC->ISER) ); //Restore interrupts } 出于某种原因,当它执行AppEntry()时,它会跳转到下面的代码,并且不会在位置0x08003000处执行主应用程序: HardFault_Handler\ PROC EXPORT HardFault_Handler [WEAK] B . ENDP 我之前在ARM7 MCU上使用过这种逻辑,它工作正常,我无法弄清楚为什么它不适用于这种基于Cortex […]

函数内的字符串文字:自动变量还是在堆中分配?

我们在里面使用的字符串文字是自动变量吗? 或者它们是否在堆中分配,我们必须手动释放? 我的情况类似于下面显示的代码,其中我将字符串文字分配给类的私有字段(在代码中标记为ONE),并在稍后的程序中检索它并使用它(标记为TWO)。 我是否将堆栈中的变量分配给ONE中的字段? 代码是否可以引用悬空指针,在这种情况下,因为程序足够小,所以可以工作? 我已编译并运行它,它工作正常,但我在我的实际程序中遇到了一个奇怪的崩溃,我将字符串文字分配给类的字段,我怀疑上面提到的情况。 #include using namespace std; class MemoryLeak { private: char *s; public: MemoryLeak() {} void store() { s = “Storing a string”; // ONE } char *retrieve() { return s; } }; int main() { MemoryLeak *obj = new MemoryLeak(); obj->store(); cout <retrieve() << endl; // TWO delete obj; return […]

如何在C ++中初始化指向特定内存地址的指针

可能重复: 指向特定固定地址的指针 关于这一点的有趣讨论从这里开始,但没有人能够提供C ++的方式: #include int main(void) { int* address = (int *)0x604769; printf(“Memory address is: 0x%p\n”, address); *address = 0xdead; printf(“Content of the address is: 0x%p\n”, *address); return 0; } 在C ++中最合适的方法是什么?

当realloc()失败并返回NULL时,它的正确用法是什么?

任何人都可以总结一下realloc()的正确用法是什么? 当realloc()失败时你会怎么做? 从我到目前为止看来,似乎如果realloc()失败,你必须free()旧指针。 真的吗? 这是一个例子: 1. char *ptr = malloc(sizeof(*ptr) * 50); 2. … 3. char *new_ptr = realloc(ptr, sizeof(*new_ptr) * 60); 4. if (!new_ptr) { 5. free(ptr); 6. return NULL; 7. } 假设realloc()在第3行失败。 我是否通过free() ing ptr在第5行做正确的事情?

如何在C中实现可变长度的’string’-y

我已经google了很多,但我找不到有关如何在高级语言中实现可变长度字符串的信息。 我正在创建自己的这种语言,我不知道从哪里开始使用字符串。 我有一个描述string类型的结构,然后是一个分配这样一个’字符串’的create函数: /* A safer `strcpy()`, using `strncpy()` and `sizeof()` */ #define STRCPY(TO, FROM) \ strncpy(TO, FROM, sizeof(TO)); TO[sizeof(TO) – 1] = ‘\0’ struct string { // … char native[1024]; }; string String__create(char native[]) { string this = malloc(sizeof(struct string)); // … STRCPY(this->native, native); return this; } 但是,这只允许1kb长的字符串。 这有点愚蠢,在大多数情况下会浪费大量内存。 鉴于我必须以某种方式声明要使用的内存…我如何实现一个能够(有效地)存储(有效)无限数量的字符的字符串?

严格的别名和内存位置

严格别名会阻止我们使用不兼容的类型访问相同的内存位置。 int* i = malloc( sizeof( int ) ) ; //assuming sizeof( int ) >= sizeof( float ) *i = 123 ; float* f = ( float* )i ; *f = 3.14f ; 根据C标准,这将是非法的,因为编译器“知道” float左值不能访问int 。 如果我使用该指针指向正确的内存,如下所示: int* i = malloc( sizeof( int ) + sizeof( float ) + MAX_PAD ) ; *i = 456 […]

如何实现内存堆

不确定如何标题,但问题是: 我听说过程序员在程序开始时分配大部分连续内存,然后在必要时将其处理掉。 这与每次需要内存时简单地访问操作系统形成对比。 我听说这会更快,因为它可以避免不断向操作系统询问连续的内存块的成本。 我相信JVM就是这样做的,维护自己的内存部分,然后从中分配对象。 我的问题是,如何实际实现这一点? 谢谢,dragonwrenn

使用哪一个 – memmove()或memcpy() – 当缓冲区不重叠时?

当源和目标重叠时使用memcpy()可能导致未定义的行为 – 在这些情况下,只能使用memmove() 。 但是如果我确定缓冲区不重叠怎么办?是否有理由使用特定的memcpy()或特定的memmove() ? 我应该使用哪个以及为什么?

每个内存访问Xeon带入缓存的字节数是多少?

我正在开发一个用C ++编写的系统,在Linux上的Xeon上运行,需要尽可能快地运行。 在RAM中保存的大型数据结构(基本上是结构数组)超过10 GB,并且需要定期访问它的元素。 我想修改数据结构以尽可能地使用系统的缓存机制。 目前,访问大多是在整个结构中随机进行的,每次读取1-4个32位的整数。 在另一次读取发生在同一个地方之前很长一段时间,因此缓存没有任何好处。 现在我知道当你从RAM中的随机位置读取一个字节时,不仅仅是那个字节被带入缓存。 我的问题是引入了多少字节? 是16,32,64,4096吗? 这被称为缓存线吗? 我希望重新设计数据结构,以最大限度地减少随机RAM访问,并使用缓存而不是缓存。 知道在随机访问中将多少字节拉入缓存将告知我所做的设计选择。 更新(2014年10月):在我提出上述问题后不久,该项目被搁置。 它已经恢复并基于下面答案中的建议,我进行了一些围绕RAM访问的实验,因为似乎TLB捶打可能正在发生。 我修改了程序以运行大页面(2MB而不是标准的4KB),观察到一个小的加速,大约2.5%。 我找到了关于在这里和这里设置大页面的很好的信息。

如何避免C / C ++中的内存泄漏

我可以使用哪些提示来避免应用程序中的内存泄漏? 在我当前的项目中,我使用了一个工具“INSURE ++”,它找到内存泄漏并生成报告。 除了该工具之外,还有任何方法可以识别内存泄漏并克服它。