CPU 访问外设方法

TMS320F2838x多核MCU外设访问控制与CPU_ID寄存器详解 在嵌入式系统开发中,内存映射寄存器是连接软件与硬件的关键接口,它定义了处理器核心如何访问和控制片上外设。其核心原理在于为每个硬件资源分配唯一的地址,使得CPU可以通过读写特定内存位置来配置外设。这项技术的核心价值在于提供了硬件级的资源抽象和管理能力,是实现复杂系统控制的基础。在多核微控制器(MCU)和实时控制系统中,精细化的外设访问控制变得至关重要,它能有效防止多核竞争和总线冲突,确保系统的确定性与可靠性。具体到应用场景,例如在工业电机驱动和数字电源等对实时性要求极高的领域,需要安全地管理CPU、DMA及协 阅读详情
在嵌入式编程里,特别是32bit CPU里,各种各样五花八门的动作是CPU通过对外设的驱动来完成的.因为底层编程大部分工作就是外设编程。
  

CPU本身几乎每一种外设都是通过读写设备上的寄存器来进行操作的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。注意,这里的外设是相对于CPU来讲的,比如S3C2440除了ARM920T的内核以外,还在同一块CPU里集成很多模块,这一些模块也称为外设。

CPU对外设IO端口物理地址的编址方式 有两种:一种是I/O映射方式(I/O-mapped)称为端口映射,另一种是存储空间映射方式(Memory-mapped),称为内存映射。而具体采用哪一种则取决于CPU的体系结构。

 

内存映射

有些体系结构的CPU(如,PowerPC、m68k等)通常只实现一个物理地址空间(RAM)。在这种情况下,外设 I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为存储空间的一部分。此时,CPU可以象访问一个内存单元那样访问外设I/O端口,而不需要 设立专门的外设I/O指令。这就是所谓的“存储空间映射方式”(Memory-mapped)。ARM体系的CPU均采用这一模式.

简而言之,就是内存(一般是SDRAM)与外设寄存器统一编址。

 

端口映射

而另外一些体系结构的CPU(典型地如X86)则为外设专门实现了一个单独地地址空间,称为“I/O地址空间”或者“I/O端口空间”。这是一个 与CPU地RAM物理地址空间不同的地址空间,所有外设的I/O端口均在这一空间中进行编址。CPU通过设立专门的I/O指令(如X86的IN和OUT指 令)来访问这一空间中的地址单元(也即 I/O端口)。这就是所谓的“I/O映射方式”(I/O-mapped)。与RAM物理地址空间相比,I/O地址空间通常都比较小,如x86 CPU的I/O空间就只有64KB(0-0xffff)。这是“I/O映射方式”的一个主要缺点。而且必须要专门的汇编语言才能处理.

 

内存映射模式下,对寄存器的访问就是某一个地址的操作,因此C语言的指针即可完成此操作。这样编程相当方便。

Linux 最早是在在X86运行,对硬件地址采用端口映射,后来又扩展到ARM之类运行.为了简化操作,Linux在所以CPU上都采用I/O端口概念.如果是象ARM这样内存映射.也被模拟成端口.

 

SOC的外设地址编址

-----------------------------------------------------------------------------------------------

对于S3C2440/S3C6410这种集成很多外设模块的SOC来说,外设的地址编址分成两种类型。

 一种是CPU内部集成的外设,这里物理地址是固定的。这个查CPU的DataSheet即可知道。

另外一种是物理上与CPU分离的IC,如Nor Flash,SDRAM网络控制器,它们通过片选信号来确定自己的物理地址.


还有一类IC的不直接映射到物理空间之上。这一类往往通过相应寄存器来间接控制。不在此讨论之列


内部模块固定地址

 

比如S3C2440内部模块地址

 
S3C6410的映射地址
 


外部模块地址分配 
 
  在CPU上都会引出多个片选线。每一个片选线表示对应一个固定的地址范围,在术语上称为(Bank).
以S3C2440为例,参见如下对应关系
在硬件设计上,第一片的SDRAM的片选线接在nGCS36上,参考上表,这片SDRAM的物理地理就是0x30000000.
DM9000的网络控制接在nGCS3这个硬件联线上,这样网络处理器的硬件地址起始地址在0x18000000.

以S3C6410为为例,它的第一步选是片选线nGCS3,SDRAM的起始地址是0x5000000之上.


软件如何读写外设

-----------------------------------------------------------------------------------------------

在内存映射模式下。对于外设的访问实际就是对内存地址的访问.在C语言里,即指针操作。为了增加阅读性,往往采用如下的宏定义.


#define rGPGCON    (*(volatile unsigned *)0x56000060) //Port G control

这个宏定义非常之复杂,所以我经常用如下五个问题来问学生或者来面试讲师的人。
1.为什么要用绝对地址,地址怎么来的?
2. unsigned *表示什么?
•3.为什么要用unsigned?
4.最左边的*表示什么?
5. volatile表示什么含意?
6.完成同样一个功能,在不同字节序下,设置的寄存器的数字是不是一样?

第一个问题比较好答.内存映射模式是直接内存访问。编址的来源看上两节

•2. unsigned *表示什么?
–  unsigned int 缩写, unsigned *表示取后面四个byte空间的宽度, 同理还有(*(volatile unsigned short *)0x56000060) 表示取后面两个字节空间。

•3.为什么要用unsigned?
–  禁止算术移位,采用逻辑移位.因为嵌入式编程大量采用移位操作。如果用带符号,会形成算术移位,即最高位符号不参与移位,这是错误操作。

•4.第一*表示什么?
–   表取指针指向空间.*(unsigned *)
  上述表达式相当如下代码的简写,
    int val;
     int * p = &val;
    *p = 0x100000; 
 5.volatile表示什么含意? 
–    其中volatile 是C的保留字,表 禁止编译器对变量访问优化. 即源码中有多少读写操作,编译后生产多少机器操作指令.否则如下代码,将不产生指令
   int a; a++ ; a-- ;
但是在硬件编程中,一次操作都可能表示特定含意.如果省略,往往出错。

6.完成同样一个功能,在不同字节序下,设置的寄存器的数字是不是一样?
   不一样,小端字节序是与手册相同顺序,即个数位表示第0位。大端字节序正好相反.

基本操作
  向寄存器赋值
   rGPBCON = 0x1000;
   
  向寄存器取值
    unsigned int val = rGPBCON;

位操作-置位操作

把第0位置1
 rGPGCON | = 0x1;
把第3位置1
  rGPGCON |= 0x8;
把第n位置1
  rGPGCON |= (0x1 <<n);
把第12,13位分别置1
   rGPGON|= (0x3) << 12;
把第10,15位分别置1
    rGPGON | = ( 0x01 << 10 ) | (0x01 << 15) ;
把(0x0 <<n)表示什么含意?
    rGPGON = (0x01 << 2) | (0x0 <<1) | (0x0 <<0);
表示占位,对应位是默认值不变.
 
位操作-清位操作
  把第1位清0
     rGPGCON &= ~(0x1);
第3位清洗0
     rGPGCON &= ~(0x8);
第n位清0
    rGPGCON &= ~(0x1 << n);
第12,13清0
    rGPGCON &= ~(0x3 << 12);
第10,15位清0
  rGPGCON &= ~((0x1 <<10) | (0x1<<15));  //<--较优
  rGPGCON &= ~(0x1 <<10)  &  ~(0x1<<15);
位操作-取位操作
  把第一位取出来
     rGBACON & 0x01
把第3位取出来
     rGBACON & 0x8
精确知道n位是1,还是0
     (rGBACON & (0x1<<n)) == (0x1<<n))


TMS320F28P65x CPU2外设访问控制:多核系统硬件级安全隔离实战 在嵌入式多核系统开发中,硬件资源的安全访问控制是保障系统稳定性的基石。其核心原理是通过硬件寄存器为不同的处理器核心(如CPU、CLA、DMA)配置对外设(如ADC、ePWM)的精确访问权限,包括完全访问、受保护的只读或无访问。这项技术的核心价值在于,它将软件的资源管理策略下沉到硬件层面强制执行,从根本上防止了多核间的资源冲突和非法访问,从而大幅提升系统的可靠性与安全性。在电机控制、汽车电子等对功能安全要求严苛的应用场景中,这种硬件级隔离机制是构建符合ISO 26262等安全标准系统的关键技术。本文以TI T 阅读详情

相关推荐

TMS320F28P65x外设访问控制(CPU1_PERIPH_AC_REGS)配置详解与实战

在嵌入式实时控制系统中,多核处理器与DMA控制器等总线主控共享外设资源时,硬件级别的外设访问控制机制是确保系统稳定性的关键技术。其核心原理是通过内存映射的专用寄存器组,为不同主控(如CPU、CLA、DMA)配置差异化的读写权限,实现资源隔离与冲突预防。这项技术的核心价值在于从硬件层面杜绝了越权访问,为构建高可靠、满足功能安全要求的系统提供了基础。在电机驱动、数字电源等复杂应用场景中,合理配置访问权限能有效防止数据污染与硬件故障。本文以TI C2000系列微控制器TMS320F28P65x的CPU1_PERI

weixin_29191081的博客 278

CPU 与外设传输数据的几种方式

查询方式、中断方式和DMA方式 查询方式 CPU不断查询外设的状态,如果外设就绪就开始传输;若还没准备好CPU就进入循环等待状态。 浪费大量CPU,降低CPU的利用率 中断方式 外设准备好后,向CPU发送中断请求,CPU接收到中断请求并再一定条件下暂停原来的程序并执行终端服务处理程序,执行完毕以后再返回原来的程序继续执行。 避免了CPU把大量时间花费在外设状态的查询上,提高了CPU的执行效率 DMA 直接存储器与外设在DMA控制器的控制下,直觉传输数据不通过CPU。传输速率主要取决于存储器的存取速度。 不需

路人coder 5583

C2000外设帧与EALLOW保护机制:嵌入式系统稳定性的硬件基石

在嵌入式系统开发中,微控制器的外设寄存器访问机制是确保系统稳定与可靠运行的核心基础。其原理在于通过硬件层面的地址映射与访问控制,将不同性能需求的外设模块划分到独立的总线区域,实现数据吞吐的优化与访问冲突的隔离。这一设计的技术价值在于显著提升了实时性系统的确定性与执行效率,避免了低速外设阻塞高速数据通路,同时为关键系统配置提供了硬件级保护。在电机控制、数字电源等对实时性要求严苛的工业应用场景中,这种精细化的外设管理机制尤为重要。以德州仪器C2000系列MCU为例,其独特的外设帧架构与EALLOW保护机制正是这

weixin_34110749的博客 538

CPU访问外设有两种方式:IO与内存统一编址&IO与内存的独立编址

一、外设都是通过读写设备上的寄存器来进行访问的,外设寄存器也成为“”I/O端口“”,而IO端口有两种编址方式:独立编址和统一编址。 1)统一编址:寄存器参与内存统一编址。外设接口中的IO寄存器(即IO端口)与主存(内存)单元一样看待,每个端口占用一个存储单元的地址,将主存的一部分划分出来用作IO的地址空间。(理解:把外设的寄存器当做是一个内存地址,从而以类似访问内存相同的方式来操作外设) /*...

baidu_37973494的博客 1万+

2023年数学建模国赛三大赛题核心建模思路与实战代码全解

本文全面解析2023年数学建模国赛三大赛题的核心建模思路与实战代码,涵盖塔式太阳能光热发电系统优化、多波束测深系统动态规划及蔬菜商品化策略建模。通过Python代码示例和优化算法(如遗传算法、NSGA2)展示,帮助参赛者掌握数学建模的关键技术与实战技巧,提升竞赛成绩。

weixin_33713350的博客 331

如何用DETR(detection transformer)训练自己的数据集

DETR(detection transformer)简介 DETR是Facebook AI的研究者提出的Transformer的视觉版本,是CNN和transformer的融合,实现了端到端的预测,主要用于目标检测和全景分割。 DETR的Github地址:link

weixin_50233398的博客 3万+

CPU与外设间数据传输方式

主要有程序传送方式、中断传送方式和直接存储器存取(DMA)传送方式,分别介绍如下。 1.程序传送方式 程序传送方式是指直接在程序控制下进行数据的输入/输出操作。程序查询方式分为无条件传送方式和查询方式(条件传送方式)两种。 一. 无条件传送方式 微机系统中的一些简单的外设,如开关、继电器、数码管、发光二极管等,在它们工作时,可以认为输入设备已随时准备好向CPU提供数据,而输出设备也随时准备好接收CPU送来的数据,这样,在CPU需要同外设交换信息时,就能够用IN或OU...

m0_61231111的博客 1万+

PHP 对接建行生活订单推送接口

php对接建行订单推送

qq_43647026的博客 559

计算机CPU对外设的访问方法

      工作前、学校里一直搞单片机,工作后、公司里改成搞计算机。单片机对GPIO、串口等外设的访问,程序中直接写寄存器就可以了;计算机中有CPU(如intel、amd)、每个外设又都有自己的控制器,那CPU怎么能访问到每个外设的控制器里面的寄存器,以实现对外设的控制呢?     其实无论单片机还是计算机中CPU,都有自己的地址空间,CPU只能访问自己的地址空间(不是内存地址空间,内存地址空间只...

JIA_GUOQIANG的博客 6261

STM32驱动AD2S1210实现旋变解码与角度读取

旋转变压器作为一种耐高温、抗振动的角度传感器,在工业伺服、机器人关节和电动汽车电驱等场景中占据重要地位。其输出信号需要经过专用转换芯片处理才能被MCU高效使用。AD2S1210是一款典型的旋变数字转换器(RDC),内部采用Type II型跟踪环,将模拟SIN/COS信号实时解算为数字角度与速度,降低了处理器负担并提升抗干扰能力。本文基于STM32平台,详细介绍了AD2S1210的硬件接线、SPI通信配置、寄存器初始化流程,以及读取位置数据时的SAMPLE脉冲时序等关键实现。同时总结了常见故障如全FF、角度跳

weixin_34194829的博客 192

为何LPDDR4支持on-die ECC,但是DDR4却不支持呢?

DRAM的ECC,目前的编码方式都是128bit data,产生8bit parity或者ECC code. 而且必须要128bit才行。这8bit的ECC code是要被写入到DRAM内存里面的,从而read的时候,可以读取这8bit ECC code来判定read data是否有错,如果是SBF,就可以纠错了,如果是double bit,大部分时候是可以detect到错误,即所谓的SEC(Single Error Correct) + DED(Double Error Detect).

一个DRAM从业者的告白 1555

C语言位操作

第一部分、章节目录 4.2.1.常用位操作符 4.2.2.位与位或位异或在操作寄存器时的特殊作用 4.2.3.如何用位运算构建特定二进制数 4.2.4.位运算实战演练1 4.2.5.位运算实战演练2 4.2.6.技术升级:用宏定义来完成位运算 第二部分、章节介绍 4.2.1.常用位操作符        本节讲解C语言中常用的位操作符,如位与、位或、位取反、位异或、左移右移等。目的...

m0_37884601的博客 1158

智能车图像处理11-进阶篇3--中线累积差值的统计

中线累积差值的统计在后面判断小S,以及长直道的时候都有用到,关键点在于中线的跳变 第12 - 13 行:comulants1 和comlants2代表的是两种不同的累差,取的行数不同 第14-17 行:comulants2取6到25行,其实就是My_Abs(LCenter[i], LCenter[i - 1])的累加 第18-21 行:comulants1去第1到40行 第27- 行: 计算了一下右线的开始于最终结束行,这里判断R_black是否为0,是和中线的提取中g

taiyuezyh的博客 3824

CPU工作原理概述

了解地址空间的概念,介绍CPU从内存中取出指令或者数据的大致过程

challenglistic的博客 2593

全志A133的AndroidSDK

本小节来学习如何下载全志安卓SDK,SDK的目录,编译和烧录提示:以下是本篇文章正文内容,下面案例可供参考以上就是整个SDK的目录和编译烧录,目的在于让初学者快速了解整个源码的目录和编译出镜像喜欢就订阅吧。

qq_24093081的博客 4054

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

CPU访问外设方法

嵌入式编程里,特别是32bit CPU里,各种各样五花八门的动作是CPU通过对外设的驱动来完成的.因为底层编程大部分工作就是外设编程。    CPU本身几乎每一种外设都是通过读写设备上的寄存器来进行操作的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。注意,这里的外设是相对于CPU来讲的,比如S3C2440除了AR

u010495838的专栏 3526

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

c语言指定外设访问宽度,CPU 访问外设方法

CPU本身几乎每一种外设都是通过读写设备上的寄存器来进行操作的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。注意,这里的外设是相对于CPU来讲的,比如S3C2440除了ARM920T的内核以外,还在同一块CPU里集成很多模块,这一些模块也称为外设。CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/...

weixin_42469649的博客 337

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

从cpu角度理解PCIe

概述 为什么需要写这篇文章,当我阅读《深入浅出SSD》这篇书籍中PCIe章节时发现,本书籍的侧重点是放在PCIe控制器和PCIe协议上,从CPU角度理解PCIe知识偏少,本文对下面几个知识点做出一些补充。 CPU访问外设寄存器与内存编址方式; CPU如何访问PCIe配置空间; CPU能够通过寄存器访问配置空间,为什么还需要映射PCIe配置空间; 如何扫描PCIe树并且为PCIe分配ID; ...

Herok 1万+

CPU对外设的编址&linux对外设的访问&CPU地址空间

(一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存、BIOS等)。在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。 物理地址空间,一部分给物理RAM(内存)用,一部分给总线用,这是由硬件设计来决定的,因此在32bits地址线的x86处理器中,物理地址空间是2的32次方,即4GB,但物理RAM一般不能上到4GB,因为还有一部分要给总线用(总

weixin_41804312的博客 4703

外设与存储器交互方式总结

外设有4种方式,可以访问自己需要的资源(包括存储器)。

qq_19286465的专栏 682

读书笔记:《操作系统真象还原》

第0章 一些你可能正感到迷惑的问题

fkuner的博客 202

多核MCU外设协同开发:从CPU2访问权限到RTOS资源管理实战

在嵌入式系统开发中,多核微控制器(MCU)通过集成多个处理器核心来提升并行处理能力,但其外设共享机制也带来了新的挑战。其核心原理在于,不同CPU核心可能拥有独立的外设地址映射视图和访问权限,这要求开发者必须理解芯片的内存架构与总线设计。从技术价值看,合理的外设协同能最大化硬件性能,避免资源冲突与数据不一致。在实际应用场景中,无论是工业控制、汽车电子还是物联网设备,都需要高效的多任务处理与实时响应。本文聚焦于多核MCU中外设的协同使用,深入探讨了核间通信(IPC)机制与RTOS下的资源管理策略,帮助开发者解决

weixin_29168393的博客 316

ZYNQ系列的实用奇葩操作(6)--PS-PL互联之裸机下操作AXI外设

1.地址赋值使用的是固定的(uint32_t *),ZYNQ是32位CPU这样操作没有问题,但在ZYNQ MPSOC这种64位的CPU上需要使用(uint64_t *),我们要尽量写和架构无关代码(这也是每个SDK都会将C语言标准的integer、short integer、char等类型重新typedef一遍的原因,这些重定义可不是闲的没事干)。2.每个寄存器的每一位对应的含义都是存在开发人员大脑里的,不满足好的代码需要能解释自身的要求。还记得之前讲的CPU指针和CPU的Memory Map吗?

Yetob的博客 782

外设获取物理内存数据_Linux系统对IO端口和IO内存的管理

一、I/O端口 端口(port)是接口电路中能被CPU直接访问的寄存器的地址。几乎每一种外设都是通过读写设备上的寄存器来进行的。CPU通过这些地址即端口向接口电路中的寄存器发送命令,读取状态和传送数据。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。二、IO内存 例如,在PC上可以插上一块图形卡,有2M...

weixin_39807691的博客 236
上一篇: Linux中source命令的用法
下一篇: ARM 异常及中断
panfengsoftware
博客等级 码龄20年 38粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值