历史上的今天
返回首页

历史上的今天

今天是:2024年12月13日(星期五)

正在发生

2021年12月13日 | 4412裸机程序之mmu

2021-12-13 来源:eefocus

内存管理单元MMU,负责虚拟地址到物理地址的转换,并提供硬件进制的内存访问权限检查,操作系统通过MMU可以实现各个用户进程自己独立的地址空间,


通过内存权限的检查可以保证每个进程使用的内存不被其他进程破坏。具体操作系统怎么运用MMU的就比较复杂了,我们只看看最原始的裸机程序怎么配置寄存器操作MMU建立虚拟地址到物理地址映射,了解其原理。


ARM提供4种映射长度:段(1M),大页(64K),小页(4K),极小页(1k)
按1M的长度映射就是说一段1M的虚拟地址映射一段1M的物理地址,这1M的地址访问权限是一样的,明显如果按1k,4k映射,内存访问权限将控制的更精细,当然也更复杂。


我们看看1M的精度怎么映射,假设要映射虚拟地址范围(0x0~0x4000000)到物理地址范围(0xB0000000~0xB4000000), 每0x100000的地址长度是1M,那么范围就是64M.
这个映射是以1M对齐的,就是要已(0x0~0x100000)这样映射,而不能(0x1~0x100001),可以看出虚拟地址和物理地址低20位变化是一样的,这样我们只需要一个4byte的内存空间存放每1M的虚拟地址右移20后与物理地址右移20位建立映射,总共4*64byte。代码大致如下:


unsigned long va = 0x0;
unsigned long pa = 0xB0000000;
while(va<0x4000000){
    ttb[va >> 20] = pa | 2;
     va += 0x100000;
     pa += 0x100000;
}


这样给定一个虚拟地址0x3000400,右移20作为ttb的index就可以找到其后12位对应的物理地址0xB3000000+0x400就是物理地址,当然这样运算是mmu自己做的,我们只需要把ttb的内存地址附给mmu的寄存器。上面的过程叫建立页表,页表建完后,启动MMU,我们操作的就是虚拟地址了。启动MMU是操作cp15协处理器,下面代码会有说明,了解下。


下面的例子我们用虚拟地址来点led.

#include "regs.h"

void (*uart_asm_putc)(int c) = 0x0202391c;
void (*uart_asm_putx)(int x) = 0x02023940;

#define GPM4CON (*(volatile unsigned int *)0xB10002E0)
#define GPM4DAT (*(volatile unsigned int *)0xB10002E4)

void init_ttb(unsigned long *ttb_base);
void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa);
void memset(char *buf, char ch, int size);
void led_blink(void);

void delay(volatile int time)
{
      for(; time > 0; time-- )
;
}

void main(void)
{    
    unsigned long c1_flags, ttb = 0x73000000;
    volatile int *p = 0x52345678;

    *p = 0x8;    

    init_ttb(ttb);
    mmap(ttb, 0x12345678, 0x52345678);
    mmap(ttb, 0xB10002E0, 0x110002E0);

    c1_flags = 1 | (1 << 3) | ( 1 << 11) | (1 << 28);

    __asm__ __volatile__ (
        "mvn r0, #0 n"            
        "mcr p15, 0, r0, c3, c0, 0n"

        "mcr p15, 0, %1, c2, c0, 0n" //configure ttb

        "mrc p15, 0, r0, c1, c0, 0n"
        "orr %0, r0, %0n"
        "mcr p15, 0, %0, c1, c0, 0n" //enable mmu
        :
        : "r" (c1_flags), "r" (ttb)
        : "r0"
    );

    p = 0x12345678;
    uart_asm_putc('r');
    uart_asm_putc('n');
    uart_asm_putc('c');
    uart_asm_putc('y');
    uart_asm_putc('j');
    uart_asm_putc(':');
    uart_asm_putx(*p);
    uart_asm_putc('r');
    uart_asm_putc('n');
     
       led_blink();
}

void init_ttb(unsigned long *ttb_base)
{
    unsigned long va, pa;

    memset(ttb_base, 0x00, 16 * 1024 );        

    for (va = 0x00000000; va < 0x10000000; va += 0x100000) { //Others
        pa = va;
        ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;    
    }

    for (va = 0x10000000; va < 0x14000000; va += 0x100000) { //SFR
        pa = va;
        ttb_base[ va >> 20] = (pa & 0xfff00000) |  2;    
    }

    for (va = 0x40000000; va < 0x80000000; va += 0x100000) { //DRAM
        pa = va;
        ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;    
    }
    
}

void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa)
{
    ttb_base[ va >> 20] = (pa & 0xfff00000) |  2;    
}

void memset(char *buf, char ch, int size)
{
    int i;
    for (i = 0; i < size; i ++)
        buf[i] = ch;
}

void led_blink(void)
{

unsigned long tmp = 0;
    int i = 0;

    /*
     *  GPM4_0-GPM4_3 设置为输出功能
     */
    tmp = GPM4CON;
    tmp &= ~0xffff;
    tmp |= 0x1111;
    GPM4CON = tmp;
    
    /*
     *  实现流水灯
     */
     while(1)
     {
        GPM4DAT = i;
        if (++i == 16)
              i = 0;
          delay(9999999);
     }
    
 }

代码位置:https://github.com/cyj1988jyc/luoji4412/

推荐阅读

史海拾趣

Hi-Optel Technologly Co Ltd公司的发展小趣事

Hi-Optel Technologly Co Ltd在电子行业中的五个发展故事

故事一:创立与初期发展

Hi-Optel Technologly Co Ltd(以下简称Hi-Optel)成立于1999年,由国有大型上市公司和国内著名风险投资机构共同投资,注册资本高达1亿美元。公司自创立之初便专注于光纤通信领域的模块开发、制造和营销。初期,Hi-Optel面临着技术挑战和市场开拓的双重压力,但凭借其强大的研发实力和敏锐的市场洞察力,逐步在光纤收发器、TO-CAN等关键产品的研发上取得突破,为后续的快速发展奠定了坚实基础。

故事二:技术创新与产品线拓展

随着技术的不断进步,Hi-Optel持续加大研发投入,不断推出新产品以满足市场需求。公司不仅拥有从TO-CAN到光纤收发器等完整产品的研发、生产和处理能力,还涵盖了不同速率和不同封装传输和数据通信的主动模块。这些产品广泛应用于SONET、以太网、FTTx、LTE和IDC光纤传输/接入系统,极大地提升了公司在行业内的竞争力。同时,Hi-Optel还积极拓展产品线,将业务范围延伸至更广泛的电子通信领域。

故事三:市场拓展与品牌建设

在市场拓展方面,Hi-Optel采取了多种策略以扩大市场份额。公司积极参加国内外各类电子通信展会,展示其最新技术和产品,吸引了众多客户和合作伙伴的关注。同时,Hi-Optel还注重品牌建设,通过提升产品质量和服务水平,赢得了客户的广泛好评。此外,公司还建立了完善的销售网络和售后服务体系,为客户提供全方位的支持和服务。

故事四:供应链优化与成本控制

为了应对激烈的市场竞争,Hi-Optel不断优化供应链管理,降低生产成本。公司与多家优质供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量的可靠性。同时,Hi-Optel还通过引入先进的生产设备和工艺,提高生产效率和产品质量,进一步降低了生产成本。这些措施不仅增强了公司的市场竞争力,还为公司的可持续发展提供了有力保障。

故事五:国际化战略与全球化布局

随着全球化进程的加速,Hi-Optel积极实施国际化战略,拓展海外市场。公司成立了多个海外分支机构,并在多个国家和地区建立了销售网络和售后服务体系。通过与国际知名企业的合作与交流,Hi-Optel不断提升自身的技术水平和品牌影响力。同时,公司还积极参与国际标准和规范的制定工作,推动行业技术的进步和发展。这些努力使得Hi-Optel在全球电子通信领域的影响力日益增强。

Hirosugi-Keiki公司的发展小趣事

对于门控夜明灯电路,网友们可能会有多种问题,以下是一些常见问题及其详细回答:

一、工作原理相关问题

  1. 问:门控夜明灯电路是如何实现自动开关的?
    : 门控夜明灯电路主要通过门控开关、延迟电路、光控电路和电源电路等几部分组成。当门打开时,门控开关触发电路,使电灯点亮。同时,延迟电路控制电灯的点亮时间,一般为几十秒左右。光控电路则确保在光线较暗的环境下(如夜晚)电路才会工作,而在白天则自动封锁电路,避免电灯误亮。

  2. 问:电路中的光控部分是如何工作的?
    : 电路中的光控部分通常由光敏电阻器(如MG45型)和相关的电子元件组成。光敏电阻器的阻值会随着光照强度的变化而变化。在白天,由于光照强度大,光敏电阻器呈现低阻值状态,导致电路中的某个三极管(如VT3)导通,进而封锁整个电路,使电灯不会点亮。而在夜晚,光照强度减弱,光敏电阻器呈现高阻值状态,三极管截止,电路恢复正常工作状态,受门控开关控制。

二、安装调试相关问题

  1. 问:如何安装门控夜明灯电路?
    : 安装门控夜明灯电路时,首先需要将干簧管安装在门框上,将小磁铁安装在门上,并确保两者在门关闭时能够对准并吸合。接着,将电路板固定在合适的位置,并连接好电源线和电灯线。最后,进行电路调试,确保电路能够正常工作。

  2. 问:如何调整电灯的点亮时间?
    : 电灯的点亮时间主要由延迟电路中的电阻和电容决定。要调整点亮时间,可以通过改变电阻(如R2)的阻值或电容(如C1)的容量来实现。一般来说,电阻阻值增大或电容容量增大,都会导致点亮时间延长;反之,则点亮时间缩短。

三、故障排除相关问题

  1. 问:如果电灯不亮,可能是什么原因?
    : 如果电灯不亮,可能是由多种原因造成的。首先,应检查电源是否正常,以及电路中的保险丝是否熔断。其次,检查门控开关是否工作正常,即干簧管和小磁铁是否能够在门打开时正确触发电路。此外,还应检查光控电路是否因光线过强而处于封锁状态。最后,检查电灯本身是否损坏。

  2. 问:电灯在白天也会亮,怎么办?
    : 如果电灯在白天也会亮,可能是光控电路出现了问题。首先,应检查光敏电阻器是否损坏或受到其他光源的干扰。其次,检查与光敏电阻器相关的电子元件(如VT3)是否工作正常。如果问题依然存在,可能需要重新调整光控电路的灵敏度或更换相关元件。

四、其他相关问题

  1. 问:门控夜明灯电路适用于哪些场合?
    : 门控夜明灯电路适用于需要自动照明的各种场合,如家庭玄关、走廊、楼梯间等。它能够在人们进门时自动点亮电灯,为人们提供方便,同时也能够节省能源。

  2. 问:如何选择合适的电灯与电路匹配?
    : 在选择电灯与电路匹配时,首先需要考虑电灯的功率和类型。由于门控夜明灯电路通常设计为低功耗电路,因此建议选择功率较小、发光效率较高的电灯,如LED灯泡。此外,还需要确保电灯的电压和电流与电路的输出相匹配,以避免电路损坏或电灯烧毁。

Fong Ya Enterprise Co Ltd公司的发展小趣事

Fong Ya Enterprise Co., Ltd在电子行业中的发展故事

故事一:初创与基础奠定

Fong Ya Enterprise Co., Ltd(以下简称“丰雅企业”)成立于某个时期(具体年份可能因资料限制而未知),自那时起便致力于电子元件领域,特别是电阻器的研发与生产。初期,公司面临着市场竞争激烈、技术壁垒高等挑战,但凭借对电子技术的深刻理解和对市场需求的敏锐洞察,丰雅企业逐步确立了自身的产品定位,即专注于高品质、高性能的电阻器产品。通过不断优化生产工艺和提升产品质量,丰雅企业在电子行业逐渐站稳了脚跟。

故事二:技术创新与产品研发

随着电子行业的快速发展,丰雅企业深刻认识到技术创新的重要性。公司加大了对研发的投入,引进了一批高素质的技术人才,并建立了完善的研发体系。通过不断的技术创新,丰雅企业成功开发出了一系列具有自主知识产权的新型电阻器产品,这些产品不仅性能优越,而且满足了市场对电子元器件日益多样化的需求。同时,公司还积极与国内外知名高校和科研机构开展合作,共同推动电子元件技术的进步。

故事三:市场拓展与国际化战略

在稳固国内市场的同时,丰雅企业积极实施国际化战略,将目光投向了更广阔的国际市场。公司参加了多个国际性的电子展会,与全球各地的客户建立了良好的合作关系。通过提供优质的产品和服务,丰雅企业在国际市场上赢得了良好的口碑和信誉。此外,公司还根据不同国家和地区的市场特点,制定了差异化的营销策略,进一步扩大了市场份额。

故事四:供应链管理优化

为了提高生产效率和降低成本,丰雅企业不断优化供应链管理。公司与多家优质供应商建立了长期稳定的合作关系,确保原材料的质量和供应的稳定性。同时,公司还引入了先进的供应链管理系统,实现了对生产、采购、库存等各个环节的精细化管理。通过优化供应链管理,丰雅企业不仅提高了生产效率,还降低了运营成本,为企业的可持续发展奠定了坚实的基础。

故事五:品牌建设与企业文化

在多年的发展过程中,丰雅企业始终注重品牌建设和企业文化建设。公司坚持“质量第一、客户至上”的经营理念,致力于为客户提供优质的产品和服务。同时,公司还注重培养员工的创新精神和团队协作精神,营造了积极向上的企业文化氛围。通过品牌建设和企业文化的推动,丰雅企业在电子行业中的知名度和影响力不断提升,为企业的长远发展注入了强大的动力。

需要注意的是,由于具体年份和详细数据的限制,以上故事在描述时可能存在一定的概括性。然而,这些故事都基于丰雅企业在电子行业中的实际发展情况而构建,旨在展现其在技术创新、市场拓展、供应链管理和品牌建设等方面的努力和成就。

硕颉(BITEK)公司的发展小趣事

硕颉科技股份有限公司成立于1999年11月,总部设在台北市。自成立以来,公司一直专注于积体电路的设计、研发与销售,致力于为客户提供高质量的电子产品解决方案。在创立初期,硕颉便以其创新的技术和严谨的研发态度,迅速在电子行业崭露头角。公司资本额为新台币三亿三仟万元,为公司的稳健发展提供了坚实的资金基础。

Green Solution Technology Co Ltd公司的发展小趣事

硕颉科技不断推出创新产品,主打系列包括逆变器、LED驱动器、线性稳压器、AC/DC驱动器、MOSFET、视频编码器和解码器以及图像处理器等。这些产品广泛应用于消费电子领域,满足了市场对高质量电子产品的需求。同时,公司积极拓展销售网络,以台湾、韩国、中国大陆和日本等地区为主,逐步向全球市场扩张。

ADMOS公司的发展小趣事

面对不断变化的市场需求和技术趋势,ADMOS公司始终保持着对创新的热情和追求。公司投入大量资源用于研发新的技术和产品,不断推出具有创新性和竞争力的产品。这些创新成果不仅提升了ADMOS在市场上的竞争力,也为公司的未来发展指明了方向。

问答坊 | AI 解惑

电路设计是如何确定限流电阻的阻值

各位大虾,在设计电路原理图时,两个集成芯片连接时往往都要串联电阻,而非直接相连,请问这些限流电阻的阻值如何确定?…

查看全部问答>

分享一段十六进制转十进制的代码

ACDBUF是一个int型十六进制数最大为0xfff。   a=ADCBUF & 0XF00 >>8;    b=ADCBUF & 0X0F0 >>4;    c=ADCBUF & 0X00F;    a=a&0x08*8+a&0x04*4+a&0x02*2+a&0x01;a=a*256;    b=b&0x08*8+b& ...…

查看全部问答>

摄象头驱动需要添加哪几个组件??

我wince5.0下执行CamTest2.exe(厂家提供的camer测试程序),弹出如下对话框。 This test program only supports MJPEG stream formats. the driver reports format 5 supported . 请问MJPEG对应在PB下需要添加哪几个组件?? 驱动是厂家提供的 ...…

查看全部问答>

怎么在EVC中修改WINCE的IP地址?

我按照网络上的方法来修改IP地址,为什么老是不行,虽然程序执行成功,该添加的注册表项也添加了,但是为什么老是改不成功呢? 我用的方法如下: HKEY   hkey;      CString   strKeyName  &nbs ...…

查看全部问答>

2440 I2S AD转换问题

请问能够通过I2S音频解码芯片进行ADC转换,再通过I2S接口回传至2440处理器吗?如何操作? 音频芯片AK4554自带I2S接口,以及两路ADC转换,默认ADC一直工作,是否ADC的数据直接送到 了I2S的SDO口?将SDO口接到2440的SDI口,通过寄存器能读出ADC转换 ...…

查看全部问答>

求eVC FTP Client类

大家好!哪位大侠有现成的FTP client类,分享一下,不胜感激! 网上下载的CFtpSockClient通讯失败时会死掉…

查看全部问答>

有51基础想学ARM

有点51基础,想学ARM,最近在学校ARM硬件结构知识,只可惜没有实验板,没实践!呵呵……希望能有机会!…

查看全部问答>

学习心的+USB

学了这么长时间的单片机,我觉得最好的办法还是在实践中能快速的成长。只有自己手里有活了,自己就有了学习的目的,知道自己怎么学习,学习哪方面就有了具体的学习方向。不过还是觉得单片机要学的东西很多,最近喜欢上USB了,不知有没有大虾做过, ...…

查看全部问答>

虚拟机不能上网怎么解决

来自 电子工程师技术交流(12425841) NETDEV WATCHDOG: eth0: transmit timed out还有这个问题 …

查看全部问答>