restrict #pragma MUST_ITERATE( , , ) _nassert

2024-04-09 23:38

本文主要是介绍restrict #pragma MUST_ITERATE( , , ) _nassert,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

restrict的作用就是限制一个指针对一块内存的访问,进一步说就是如果一块内存区域通过一个受限制指针访问,那么它就不能通过另一个受限指针访问。

引入restrict的目的是确保同一块内存上没有其它引用,让编译器更好地优化指令,生成更有效的汇编代码。


把#pragma MUST_ITERATE( , , )放在循环体之前,告知开发板循环次数,改善软件流水

MUST_ITERATE告诉编译器循环的属性,但是这些属性必须是真实的,不然程序可能运行出错。此指令主要用于优化C函数循环,一般情况下,只要有循环都最好带上此指令

#pragma MUST_ITERATE(min, max, multiple);其中multiple参数必须有,循环执行次数必是multiple的整数倍。
这个信息对编译器使用软件流水技术非常重要

那min和max是最大和最小循环次数


const short *restrict x;

//Assumption: Vectors x and h are double-word aligned
_nassert((int)x % 8 == 0);


是个断言语句。
对条件进行判断,如果为1,通过,为0,则抛出异常。


通过对printf() 和 LOG_printf() 运行时间作比较发现,在C6211运行在150MHz的情况下,printf()需花费4000个周期约26.7μs, LOG_printf()只花费36个周期约0.24μs。printf()  LOG_printf() 多开销100倍以上的时间,因此 LOG_printf() 对于实时地显示一些运行状态是非常有帮助的。而且对于熟悉C语言的开发者来说, LOG_printf() 的调用格式几乎与printf() 完全一样。


就象大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。

volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.

  简单地说就是防止编译器对代码进行优化.比如如下程序:
  XBYTE[2]=0x55;
  XBYTE[2]=0x56;
  XBYTE[2]=0x57;
  XBYTE[2]=0x58;
  如果对外部硬件上述四条语句分别表示不同的操作,会产生四种不同的动作,那么编译器就不能像对待纯粹的程序那样对上述四条语句进行优化只认为XBYTE[2]=0x58;而忽略前三条语句(即只产生一条机器代码),此时编译器会逐一的进行编译并产生相应的机器代码(四条).

 一般说来,volatile用在如下的几个地方:

  1、 中断服务程序中修改的供其它程序检测的变量需要加volatile;
  2、多任务环境下各任务间共享的标志应该加volatile;
  3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
  另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实
  现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。


 // Next two lines for debug only to halt the processor here
  // Remove after inserting ISR Code
   asm ("      ESTOP0");
   for(;;);

  asm ("      ESTOP0");    是停止仿真的意思。
1.连接仿真器后ESTOP0是0还是1?
是1的话就会停止仿真
是0的话就会执行下面的for循环, 处理器就停留在此处了。。。。

General Purpose Input Output (通用输入/输出)简称为GPIO


这篇关于restrict #pragma MUST_ITERATE( , , ) _nassert的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/889538

相关文章

Error: label vector and instance matrix must be double的解决方法

在使用uci下载的数据时,建模时出现这个错误的解决方法 首先现在UCI上面下载数据 然后右键另存为就行了。这样我们就从UCI里面下载到了训练数据 在matlab 点 导入数据,数据类型要记得选第二个, 如果选择最后一个table就会出现这个问题 最后附上代码 %%之前先import wine.date IMPORTED DATA 设为Numeric Matrix (数值矩

if !defined与pragma once

两者的共同点都是为了避免同一个文件被include多次,但是各有千秋。 在用VC6.0向导生成的头文件中,经常可以看见如下的代码段:  #if !defined(AFX_RESIZABLELAYOUT_H__INCLUDED_)  #define AFX_RESIZABLELAYOUT_H__INCLUDED_  #if _MSC_VER > 1000  #pragma once  #e

The method xxxx of type xxxx must override a superclass method 解决方式

使用eclipse/myeclipse 时可能会出现@override 报错的问题 The method xxxx  of type xxxx  must override a superclass method 解决方法一: 修改eclipse的 Compiler level  window ---> preferences-->java -->Compiler 把Co

glup server 报错 Task function must be specified

解决方案 今天像往常一样,编写文章,并使用gulp bulid压缩代码,但是一运行:gulp build 就出现了这个错误:AssertionError: Task function must be specified。 gulp项目需要全局安装gulp和项目内安装gulp,通过 gulp -v 查看全局gulp 和本地项目的gulp版本: image.png 这俩显然,不一致。 下面,

启动Eclipse失败,提示A Java Runtime Environment(JRE)or java Development Kit(JDK)must ...

今天启动Eclipse时提示错误信息: 在网上找了好多资料都没有解决,最后决定重新配置一下jdk环境。 于是卸载了jdk,然后重新安装jdk,配置JAVA_HOME,顺利启动了Eclipse。 原因是:不知道谁修改了我电脑中的jre目录名称,将 jre1.8.0_91 修改成了jre,导致无法启动Eclipse。 总结:启动Eclipse失败的原因,说到底还是和jdk环境有

No enclosing instance of type Outer is accessible. Must qualify the allocation with an enclosing ins

之前看内部类的时候没发现这个问题,今天写代码的时候遇到,写个最简单的例子: 下面这一段代码 红色的部分就是编译报错: No enclosing instance of type Outer is accessible. Must qualify the allocation with an enclosing instance of type Outer (e.g. x.new

The manifest(with formatversion 2)must not contain the following tags:run_depends

按照ROS WIKI入门教程学习创建ROS消息和ROS服务时,在package.xml中添加 <build_depend>message_generation</build_depend><run_depend>message_runtime</run_depend> 后编译出现The manifest(with formatversion 2)must not contain the fol

Xcode7 You must rebuild it with bitcode enabled (Xcodesetting ENABLE_BITCODE)

以前的项目 放到Xcode7中运行时可能会遇到以下错误:You must rebuild it with bitcode enabled (Xcodesetting ENABLE_BITCODE) 未来Watch应用须包含Bitcode,iOS不强制,但Xcode7默认会开启Bitcode。 如何适配? 方法一:更新library使包含Bitcode,否则会出现以下中的警告;

#pragma   warning(push)

#pragma   warning(push)是保存当前的编译器警告状态; #pragma   warning(pop)是恢复原先的警告状态。 例如: #pragma   warning(   push   ) #pragma   warning(   disable   :   4705   ) #pragma   warning(   disable   :   4706   ) #pragm

MATLAB报错:MTIMES is not fully supported for integer classes. At least one input must be scalar.

Error using  *  MTIMES is not fully supported for integer classes. At least one input must be scalar. To compute elementwise TIMES, use TIMES (.*) instead. double型数据 * uint8型数据 会出现上述错误 需要把uint8