- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在我的NXP LPC11U37H主板(ARM Cortex-M0)上分析一些算法,因为我想知道执行特定算法需要多少个时钟周期。
我编写了这些简单的宏来进行一些分析:
#define START_COUNT clock_cycles = 0;\
Chip_TIMER_Enable(LPC_TIMER32_1);\
Chip_TIMER_Reset(LPC_TIMER32_1);\
#define STOP_COUNT Chip_TIMER_Disable(LPC_TIMER32_1);\
#define GET_COUNT clock_cycles = Chip_TIMER_ReadCount(LPC_TIMER32_1);\
myprintf("%d\n\r", clock_cycles);\
START_COUNT;
algorithm();
STOP_COUNT;
GET_COUNT;
START_COUNT;
for (volatile int i = 0; i < 1000; i++);
STOP_COUNT;
GET_COUNT;
START_COUNT;
for (volatile int i = 0; i < 1000; i++);
STOP_COUNT;
GET_COUNT;
START_COUNT;
for (volatile int i = 0; i < 1000; i++);
STOP_COUNT;
GET_COUNT;
21076
19074
21074
最佳答案
好的,很开心,为您举了一个简单的例子。首先,每年都会过去,不知道迈克尔·阿布拉什(Michael Abrash)是谁的新开发人员来了,世界已经改变了,工具更好,硬件更好,很多人都可以进行调整。但是禅宗的汇编语言与IMO非常相关,尤其是这个问题。
https://github.com/jagregory/abrash-zen-of-asm
当这本书问世时,8088是个老新闻,而今天对其进行性能调整的意义甚至不大。但是,如果这是您在本书中看到的全部内容,那么您将丢失。我用在下面学到的东西,每天都在逻辑,芯片和板上跳动……使它们发挥作用和/或使它们断裂。
答案的重点不一定是显示如何概要分析某些内容,尽管它可以,因为您已经在概要分析某些内容。但这有助于表明它并不像您期望的那样简单,除了您编写的C代码之外,还有其他因素。 C代码在flash中的放置,flash与ram,是否等待状态,是否预取(如果有),分支预测(如果有)都将产生很大的不同。我什至可以演示相同的指令序列,但对齐方式会有所不同,从而改变结果。高兴的是,您在cortex-m0上没有缓存,这会使混乱并平方...
我在某处有NXP芯片,并且附近至少有一个cortex-m0 +,但是从st.com选择了一个cortex-m0。 STM32F030K6T6,因为它已经连接好并可以使用了。有一个内置的8Mhz振荡器和一个pll乘以,因此首先使用8Mhz然后再使用48。它没有四个不同的等待状态作为您的芯片,它有两种选择,小于或等于24Mhz或大于(最多48个)。但是它确实有预取功能,您可能没有。
您可能有一个systick计时器,芯片供应商可以选择是否编译。它们始终位于同一地址(到目前为止,在cortex-ms中)
#define STK_CSR 0xE000E010
#define STK_RVR 0xE000E014
#define STK_CVR 0xE000E018
#define STK_MASK 0x00FFFFFF
PUT32(STK_CSR,4);
PUT32(STK_RVR,0xFFFFFFFF);
PUT32(STK_CVR,0x00000000);
PUT32(STK_CSR,5);
//count down.
.thumb_func
.globl PUT32
PUT32:
str r1,[r0]
bx lr
.align 8
.thumb_func
.globl TEST
TEST:
ldr r3,[r0]
test_loop:
sub r1,#1
bne test_loop
ldr r2,[r0]
sub r3,r2
mov r0,r3
bx lr
08000100 <TEST>:
8000100: 6803 ldr r3, [r0, #0]
08000102 <test_loop>:
8000102: 3901 subs r1, #1
8000104: d1fd bne.n 8000102 <test_loop>
8000106: 6802 ldr r2, [r0, #0]
8000108: 1a9b subs r3, r3, r2
800010a: 1c18 adds r0, r3, #0
800010c: 4770 bx lr
800010e: 46c0 nop ; (mov r8, r8)
8000110: 46c0 nop ; (mov r8, r8)
8000112: 46c0 nop ; (mov r8, r8)
PUT32(FLASH_ACR,0x00);
ra=TEST(STK_CVR,1000);
hexstring(ra);
ra=TEST(STK_CVR,1000);
hexstring(ra);
PUT32(FLASH_ACR,0x10);
ra=TEST(STK_CVR,1000);
hexstring(ra);
ra=TEST(STK_CVR,1000);
hexstring(ra);
PUT32(FLASH_ACR,0x01);
ra=TEST(STK_CVR,1000);
hexstring(ra);
ra=TEST(STK_CVR,1000);
hexstring(ra);
PUT32(FLASH_ACR,0x11);
ra=TEST(STK_CVR,1000);
hexstring(ra);
ra=TEST(STK_CVR,1000);
hexstring(ra);
00000FA0
00000FA0
00000FA0
00000FA0
00001B56
00001B56
00000FA2
00000FA2
add one nop
00001388
00001388
00001388
00001388
00001F3F
00001F3F
00001389
00001389
two nops
00001770
00001770
00001770
00001770
0000270E
0000270E
00001B57
00001B57
three nops
00001B58
00001B58
00001B58
00001B58
00002AF7
00002AF7
00002133
00002133
eight nops
00002EE0
00002EE0
00002EE0
00002EE0
00004A36
00004A36
000036AE
000036AE
9
000032C8
000032C8
000032C8
000032C8
00004E1F
00004E1F
00003A96
00003A96
10
000036B0
000036B0
000036B0
000036B0
000055EE
000055EE
00003E7E
00003E7E
11
00003A98
00003A98
00003A98
00003A98
000059D7
000059D7
00004266
00004266
12
00003E80
00003E80
00003E80
00003E80
000061A6
000061A6
0000464E
0000464E
16
00004E20
00004E20
00004E20
00004E20
00007916
00007916
000055EE
000055EE
no wait state speeds
0x0FA0 = 4000 0
0x1388 = 5000 1
0x1770 = 6000 2
0x1B58 = 7000 3
0x2EE0 = 12000 8
0x4E20 = 20000 16
slow flash times
0x1B56 = 6998 0
0x1F3F = 7999 1
0x270E = 9998 2
0x2AF7 = 10999 3
0x4A36 = 18998 8
0x4E1F = 19999 9
0x55EE = 21998 10
0x59D7 = 22999 11
0x61A6 = 24998 12
0x7916 = 30998
slow, no prefetch
00001B56
00001B56
slow, with prefetch
00000FA0
00000FA2
9 wait states
00004E1F
00004E1F
00003A96
00003A96
10 wait states
000055EE
000055EE
00003E7E
00003E7E
b one
nop
nop
nop
one:
b two
nop
nop
nop
two:
ra=0x20000800;
PUT16(ra,0x6803); ra+=2;
PUT16(ra,0x3901); ra+=2;
PUT16(ra,0xd1fd); ra+=2;
PUT16(ra,0x6802); ra+=2;
PUT16(ra,0x1a9b); ra+=2;
PUT16(ra,0x1c18); ra+=2;
PUT16(ra,0x4770); ra+=2;
PUT16(ra,0x46c0); ra+=2;
PUT16(ra,0x46c0); ra+=2;
PUT16(ra,0x46c0); ra+=2;
PUT16(ra,0x46c0); ra+=2;
PUT16(ra,0x46c0); ra+=2;
PUT16(ra,0x46c0); ra+=2;
ra=branchto(STK_CVR,1000,0x20000801);
hexstring(ra);
ra=branchto(STK_CVR,1000,0x20000801);
hexstring(ra);
.thumb_func
.globl branchto
branchto:
bx r2
00000FA2
00000FA0
关于c - 相同(重复)代码的时钟周期值不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36627456/
我想知道如何考虑需要您做出某些选择才能看到最终结果的搜索系统。我说的是 select 表单,您可以在其中根据您的选择继续操作,然后您会看到结果。 下面描述了我正在谈论的一个随机示例。想象一下 Init
您好,我目前正在编写一些软件来管理我们的库存。我搜索了 2 个表 master_stock(保存每一个股票代码和描述)库存(保存库存代码、地点、数量...) 一切都很好,但这是我遇到的问题。 假设我的
我有 2 个表,我想合并其数据。id 是我的关键字段(增量且不同)。表1和表2字段说明例如:id - 名称 - 值 我想将表2的所有数据插入表1,它们有不同的数据,但在某些行中有相同的id。 所以当我
我正在努力解决汇编中的一个问题,我必须获取十六进制代码的第一个字节 (FF) 并将其复制到整个值中: 0x045893FF input 0xFFFFFFFF output 我所做的
我有 Eclipse Indigo 版本,我可以在其中运行 Java 和 C++ 项目。 但我只想使用另一个 Eclipse 来编写 C++ 项目。所以我将 eclipse(不是工作区)的源文件夹复制
This question already has answers here: What is a NullPointerException, and how do I fix it? (12个答案)
This question already has answers here: Numbering rows within groups in a data frame (8个答案) 5个月前关闭。
我知道用q记录到寄存器中,但我想知道是否可以设置一些东西来快速调用最后一个记录,就像一样。 回顾最后一个简短的编辑命令(有关 的讨论请参阅 here。)。 我知道@@,但它似乎只有在执行@z之后才起作
来自 Eclipse 并且一直习惯于复制行,发现 Xcode 没有这样的功能是很奇怪的。或者是吗? 我知道可以更改系统范围的键绑定(bind),但这不是我想要的。 最佳答案 要删除一行:Ctrl-A
假设我有一个包含元素的列表,例如[1,2,3,4,5,6,7,8]。我想创建长度为 N 的该元素的所有排列。 因此,对于N = 4,它将是[[1,1,1,1],[1,1,1,2],[1,1,2,1],
我有一个带有 JMenu 的 JFrame。当我在某些情况下添加包含图像的 JPanel 时,程序首次启动时菜单会重复。调整大小时重复的菜单消失。任何建议都非常感激。谢谢。代码如下: public c
我正在尝试查找目录中文件的重复项。 我对这个 block 有一个问题,它以文件地址作为参数: public void findFiles(ArrayList list){ HashMap hm
我知道这个问题已经发布并且已经给出了答案,但我的情况不同,因为我在单个方法上填充多个下拉列表,所以如果我点击此链接 After every postback dropdownlist items re
我正在尝试为我的日历应用程序实现重复模式。我希望它的工作方式与 Outlook 在您设置重复约会时的工作方式相同。 public async Task> ApplyReccurrencePeriod
我有一个利用 cookie 来支持准向导的应用程序(即,它是一组相互导航的页面,它们必须以特定顺序出现以进行注册)。 加载 Logon.aspx 页面时 - 默认页面 - 浏览器 cookie 看起来
我有 3 个输入,代码检查它们是否为空,如果为空,则将变量值添加到输入中。 所以我有 3 个具有值的变量: var input1text = "something here"; var input2t
根据数组的长度更改数组的每个元素的最佳方法是什么? 例如: User #1 input = "XYZVC" Expected Output = "BLABL" User #2 input = "XYZ
我在让 Algolia 正常工作时遇到了一些麻烦。我正在使用 NodeJS 并尝试在我的数据库和 Algolia 之间进行一些同步,但由于某种原因似乎随机弹出大量重复项。 如您所见,在某些情况下,会弹
遵循以下规则: expr: '(' expr ')' #exprExpr | expr ( AND expr )+ #exprAnd | expr ( OR expr )+ #exprO
我有一个布局,我想从左边进入并停留几秒钟,然后我希望它从右边离开。为此,我编写了以下代码: 这里我在布局中设置数据: private void loadDoctor(int doctorsInTheL
我是一名优秀的程序员,十分优秀!