Nios II 中的缓存和内存数据的读写

nios 使用地址中31bit来表示访问是否bypass cache。
如果bit 31=0 表示不bypass cache,即使用cache里的数据;如果bit 31=1表示bypass cache,即直接使用mem中的数据。
如alt_remap_uncached函数

 1 #ifdef NIOS2_MMU_PRESENT
 2 /* Convert KERNEL region address to IO region address */
 3 #define BYPASS_DCACHE_MASK   (0x1 << 29)
 4 #else
 5 /* Set bit 31 of address to bypass D-cache */
 6 #define BYPASS_DCACHE_MASK   (0x1 << 31)
 7 #endif
 8
 9 /*
10  * Convert a pointer to a block of cached memory, into a block of
11  * uncached memory.
12  */
13
14 volatile void* alt_remap_uncached (void* ptr, alt_u32 len)
15 {
16   alt_dcache_flush (ptr, len);
17   return (volatile void*) (((alt_u32) ptr) | BYPASS_DCACHE_MASK);
18 }

其中

 1 #ifdef NIOS2_FLUSHDA_SUPPORTED
 2 #define ALT_FLUSH_DATA(i) __asm__ volatile ("flushda (%0)" :: "r" (i));
 3 #else
 4 #define ALT_FLUSH_DATA(i) __asm__ volatile ("flushd (%0)" :: "r" (i));
 5 #endif /* NIOS2_FLUSHDA_SUPPORTED */
 6
 7 /*
 8  * alt_dcache_flush() is called to flush the data cache for a memory
 9  * region of length "len" bytes, starting at address "start".
10  *
11  * Any dirty lines in the data cache are written back to memory.
12  */
13
14 void alt_dcache_flush (void* start, alt_u32 len)
15 {
16 #if NIOS2_DCACHE_SIZE > 0
17
18   char* i;
19   char* end;
20
21   /*
22    * This is the most we would ever need to flush.
23    *
24    * SPR 196942, 2006.01.13: The cache flush loop below will use the
25    * ‘flushda‘ instruction if its available; in that case each line
26    * must be flushed individually, and thus ‘len‘ cannot be trimmed.
27    */
28   #ifndef NIOS2_FLUSHDA_SUPPORTED
29   if (len > NIOS2_DCACHE_SIZE)
30   {
31     len = NIOS2_DCACHE_SIZE;
32   }
33   #endif
34
35   end = ((char*) start) + len;
36
37   for (i = start; i < end; i+= NIOS2_DCACHE_LINE_SIZE)
38   {
39     ALT_FLUSH_DATA(i);
40   }
41
42   /*
43    * For an unaligned flush request, we‘ve got one more line left.
44    * Note that this is dependent on NIOS2_DCACHE_LINE_SIZE to be a
45    * multiple of 2 (which it always is).
46    */
47
48   if (((alt_u32) start) & (NIOS2_DCACHE_LINE_SIZE - 1))
49   {
50     ALT_FLUSH_DATA(i);
51   }
52
53 #endif /* NIOS2_DCACHE_SIZE > 0 */
54 }
时间: 2024-08-09 09:47:34

Nios II 中的缓存和内存数据的读写的相关文章

大话Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁

大话Linux内核中锁机制之内存屏障.读写自旋锁及顺序锁 在上一篇博文中笔者讨论了关于原子操作和自旋锁的相关内容,本篇博文将继续锁机制的讨论,包括内存屏障.读写自旋锁以及顺序锁的相关内容.下面首先讨论内存屏障的相关内容. 三.内存屏障 不知读者是是否记得在笔者讨论自旋锁的禁止或使能的时候,提到过一个内存屏障函数.OK,接下来,笔者将讨论内存屏障的具体细节内容.我们首先来看下它的概念,Memory Barrier是指编译器和处理器对代码进行优化(对读写指令进行重新排序)后,导致对内存的写入操作不能

基于Python项目的Redis缓存消耗内存数据简单分析(附详细操作步骤)

目录 1 准备工作 2 具体实施   1 准备工作 什么是Redis? Redis:一个高性能的key-value数据库.支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用:提供string.list.set.zset.hash等数据结构的存储,并支持数据的备份. 本文适合使用的场景:当一个项目中Redis缓存的数据量逐渐增大,Redis缓存的数据占用内存也会越来越大,而且其中有很多很可能是价值不大的数据.由于Redis是一个key-value数据库,所以对其中的数

NIOS II 中直接调用Modelsim仿真

STEP1:创建一个工程,实现并编译该工程,编写TestBench文件. STEP2:设置启动Modelsim的路径 选择Nios II菜单Tools->Options..,在弹出的界面中,选择Modelsim的安装路径. STEP3:选择仿真软件 选择菜单Assignments->Settings..,在弹出的界面选择Tool name为ModelSim. STEP4:选择测试代码文件 如下图所示选择,单击Test Benches 单机New 填写Test bench name,找到File

Django中的缓存(内存,文件,redis)

一.Django中的缓存的几种方法 1)单个视图缓存.时间测试 import time from django.views.decorators.cache import cache_page @cache_page(5) # 缓存5秒 def test_time(request): ctime=time.time() return HttpResponse(ctime) 在5秒内访问的时间不变,该缓存到了内存里面 2)设置全局缓存 需要在settings添加中间件 MIDDLEWARE_CLA

关于uboot中tftp上传内存数据到tftp服务器

uboot下的tftp下载功能是非常重要和常见的功能.但是偶尔有些特殊需求的人需要使用uboot的tftp具有上传功能.默认的uboot没有tftp上传功能,如果需要修改uboot代码.使用时键入第4个参数,则不同于3个参数的tftp下载功能.#tftp 50400000 xx.bin 10000TFTP to server 192.168.0.30; our IP address is 192.168.0.152Upload Filename 'xx.bin'.Upload from addr

JAVA之旅(十七)——StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder

JAVA之旅(十七)--StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder 讲完String,我们来聊聊他的小兄弟 一.StringBuffer概述 关于StringBuffer这个对象,Buffer是什么意思?缓冲区的意思,String一旦初始化时不可以被改变的,而StringBuffer是可以的,这就是区别,特点: StringBuffer是一个容器 可以字节操作多个数据类型 最终会通过toString方法变成字符串 存储 S

NIOS II ecliplse中出现Symbol &#39;XX_BASE&#39; COULD NOT BE RESOLVED解决

NIOS II ecliplse中出现Symbol 'XX_BASE' COULD NOT BE RESOLVED解决 在nios II中,明明system.h中定义了#define xxx_base 0x00000010,可是在编写程序时,调用IORD(xxx_base)或IOWR(xxx_base)时,总是提示Type 'xxxx_base' could not be resolved错误,重新编译不行,重新生成BSP也不行. 在nios II开发中,加入了一个PIO以后,也重新genera

给NIOS II CPU添加一颗澎湃的心——sysclk的使用

给NIOS II CPU添加一颗澎湃的心--系统时钟的使用 ? 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchdog工程复制.粘贴并重命名为08_sysclk_timer.在Quartus II中打开该工程,然后点击Qsys快捷图标打开Qsys组件,如下图所示: 在Qsys中,打开工程目录(08_sysclk_timer)下的mysystem.qsys工程. 打开后,在左侧的IP列表中输入"timer&q

【小梅哥SOPC学习笔记】切换NIOS II CPU的主内存后软件中需要注意的几点设置

切换NIOS II CPU的主内存后软件中需要注意的几点设置 有时候,我们可能面对这样一种情况: 1. 我们创建一个SOPC系统,并在QSYS中设置NIOS II的复位地址和异常地址都指向SRAM: 2. 我们创建了正确的NIOS II软件工程并能够正常运行 3. 由于某种需求(如SRAM内存不够用了,需要换成内存更大的SDRAM),我们在面在QSYS中将NIOS II CPU的复位地址和异常地址修改为SDRAM 4. 我们需要继续使用之前创建的NIOS II软件工程. 这里,如果我们更改后直接