在这里使用伪代码.这些风格是否有利有弊:
假设你有一个可以添加的alu,和,或者和xor.它是最好有一个计算可能的答案所有的时间,然后选择基于操作码的答案代码(在这种情况下,一个热):
alu_add = a + b;
alu_and = a & b;
alu_or = a | b;
alu_xor = a ^ b;
...
if(opcode[0]) alu_out = alu_add;
else if(opcode[1]) alu_out = alu_and;
else if(opcode[2]) alu_out = alu_or;
else if(opcode[3]) alu_out = alu_xor;
Run Code Online (Sandbox Code Playgroud)
另一种方法是像这样编码:
if(opcode[0]) alu_out = a + b;
else if(opcode[1]) alu_out = a & b;
else if(opcode[2]) alu_out = a | b;
else if(opcode[3]) alu_out = a ^ b;
Run Code Online (Sandbox Code Playgroud)
我也看到它:
alu_add = a + b;
alu_and = a & …Run Code Online (Sandbox Code Playgroud) 我将MSP430F2013处理器用于没有UART的应用程序.我需要一个UART,因此我使用TI的示例代码"msp430x20x3_ta_uart2400.c"来模拟使用定时器模块.这一切都运行良好(使用IAR Embedded Workbench编译),使用PuTTY测试它以将字符传输到开发板,并使用环回将它们回显到终端.
这是一个降低风险的练习,现在我已将该代码移植到我的应用程序的状态机中.完成此操作后,我遇到了有关定时器中断和低功耗睡眠模式的问题.这是我进入低功耗(睡眠)模式的代码片段:
// Prepare the UART to receive one byte.
prepare_receiver();
// Enter low power mode 1.
__bis_SR_register(LPM1_bits + GIE);
// Check whether the full message has been received.
if(true == get_message_complete())
{
process_event(e_euart_message_received, NULL);
}
Run Code Online (Sandbox Code Playgroud)
我在调试器(C-Spy)上看到的是,有时它会bis_SR_register()在第一个条目上执行该行,然后转到if语句,即忽略我要求它进入睡眠状态的事实.在其他情况下,当它确实进入睡眠状态时,ISR会正确触发并最终将我带回if语句以继续执行程序(正如我所料).但是,如果我尝试跳到下一个语句,应用程序会冻结第一行,即我无法前进.
我想不出任何功能上与我正在做的TI示例有什么不同,所以我认为我的问题必须与我如何移植它有关.例如,我的Timer ISR和我在这里发布的代码是在不同的编译单元 - 这种决定会对事情有什么影响吗?我知道我的问题可能有点模糊,但不幸的是我无法发布我的所有代码,所以相反,我正在寻找有MSP经验的人,他可能会提出一些建议,或者一些潜在的陷阱,我可能已陷入其中.
假设我们有一个exe,可以很容易地转换为汇编吗?软件作者有没有办法阻止/阻止这种情况?
所以在arm-none-eabi-gcc中使用C语言.我一直有指针问题,它们似乎不存在.也许我将错误的cmds传递给编译器.
这是一个例子.
unsigned int * gpuPointer = GetGPU_Pointer(framebufferAddress);
unsigned int color = 16;
int y = 768;
int x = 1024;
while(y >= 0)
{
while(x >= 0)
{
*gpuPointer = color;
color = color + 2;
x--;
}
color++;
y--;
x = 1024;
}
Run Code Online (Sandbox Code Playgroud)
以及反汇编程序的输出.
81c8: ebffffc3 bl 80dc <GetGPU_Pointer>
81cc: e3a0c010 mov ip, #16 ; 0x10
81d0: e28c3b02 add r3, ip, #2048 ; 0x800
81d4: e2833002 add r3, r3, #2 ; 0x2
81d8: e1a03803 lsl r3, r3, #16 …Run Code Online (Sandbox Code Playgroud) 我正在尝试学习一些汇编,但我很难理解一些基本的东西是做什么的。eax ebx ecx 只是变量还是除了存储值之外它们都有独特的特定用途?
我正在使用 ARM 脚本创建 AKS 集群。目标是从 0 开始创建具有所有所需配置 VN、NGS 和 AgentPool 的集群。这是我的 ManagedCluster ARM 模板:
{
"apiVersion": "2020-03-01",
"name": "[parameters('clusterName')]",
"type": "Microsoft.ContainerService/managedClusters",
"location": "[parameters('templateSettings').location]",
"properties": {
"kubernetesVersion": "[parameters('kubernetesVersion')]",
"enableRBAC": true,
"dnsPrefix": "[parameters('dnsPrefix')]",
"agentPoolProfiles": [
{
"name": "nodepool",
"count": "[parameters('agentCount')]",
"vmSize": "[parameters('agentVMSize')]",
"osDiskSizeGB": "[parameters('osDiskSizeGB')]",
"vnetSubnetID": "[parameters('vnetSubnetID')]",
"maxPods": 110,
"minCount": 1,
"maxCount": 100,
"enableAutoScaling": true,
"type": "VirtualMachineScaleSets",
"storageProfile": "ManagedDisks"
}
],
"servicePrincipalProfile": {
"ClientId": "[parameters('servicePrincipalClientId')]",
"Secret": "[parameters('servicePrincipalClientSecret')]"
},
"networkProfile": {
"loadBalancerSku": "standard",
"networkPlugin": "kubenet"
},
"addonProfiles": {
"httpApplicationRouting": {
"enabled": true
},
"omsagent": …Run Code Online (Sandbox Code Playgroud) 我一直想知道,是否有一些看不见的操作码或标志或任何告诉汇编指令如何处理其参数的东西?有点困惑,因为显然相同的指令可以使用不同类型的操作数操作 - 支持寄存器,存储器地址,偏移和立即值.
在汇编程序的"文本表示"中似乎没有任何额外的细节,但是二进制可能存在差异,例如,一些位被切换以便CPU知道使用哪种类型的操作数?
我试图弄清楚如何从ASM指令中提取寄存器值并将其转换为C++中的变量.
例如:MOV DWORD PTR DS:[ESI],EDI
(假设EDI值为int)int value = EDI;
基本上,我很难使执行时间比实际时间要短,并且要减少时钟周期和内存大小。有谁知道我该怎么做吗?代码工作正常,我只想稍作更改。
编写了有效的代码,但不想弄乱代码,但也不知道要进行哪些更改。
; Calculation of a factorial value using a simple loop
; set up the exception addresses
THUMB
AREA RESET, CODE, READONLY
EXPORT __Vectors
EXPORT Reset_Handler
__Vectors
DCD 0x00180000 ; top of the stack
DCD Reset_Handler ; reset vector - where the program starts
AREA 2a_Code, CODE, READONLY
Reset_Handler
ENTRY
start
MOV r1,#0 ; count the number of multiplications performed
MOV r2,#3 ; the final value in the factorial calculation
MOV r3,#1 ; the factorial result will be stored …Run Code Online (Sandbox Code Playgroud) 我正在尝试建立一个裸机 Kubernetes 集群。我已经设置了基本的集群,没问题,但我似乎无法让 MetalLB 正常工作以向服务公开外部 IP。
我的最终目标是能够部署具有 2 个以上副本的应用程序,并拥有一个我可以引用的单个 IP/端口,以便访问任何正在运行的实例。
到目前为止,我所做的(为了测试这一点)是:
kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/metallb.yaml
kubectl apply -f metallb-layer-2.yml
kubectl run nginx --image=nginx --port=80
kubectl expose deployment nginx --type=LoadBalancer --name=nginx-service
Run Code Online (Sandbox Code Playgroud)
metallb-layer-2.yml:
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: k8s-master-ip-space
protocol: layer2
addresses:
- 192.168.0.240-192.168.0.250
Run Code Online (Sandbox Code Playgroud)
然后当我运行时kubectl get svc,我得到:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service LoadBalancer 10.101.122.140 <pending> 80:30930/TCP 9m29s
Run Code Online (Sandbox Code Playgroud)
无论我做什么,我都无法让服务拥有外部IP。有没有人有想法?
编辑:在找到有关使用 NodePort 的另一篇文章后,我执行了以下操作:
iptables -A FORWARD -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
在 …