我正在浏览一些嵌入式编程链接 http://www.micromouseonline.com/2016/02/02/systick-configuration-made-easy-on-the-stm32/
【注意上面链接的代码作者已经更新了代码,delay_ms()文章中的实现不再使用下图所示的解决方案。】
并最终得到以下代码。这是针对 ARM 架构的,但基本上这是一个函数,它会导致作为参数传递的某些毫秒的延迟。所以我可以理解 if 条件,但为什么这里需要 else 条件?有人可以向我解释一下吗?
void delay_ms (uint32_t t)
{
uint32_t start, end;
start = millis();//This millis function will return the system clock in
//milliseconds
end = start + t;
if (start < end) {
while ((millis() >= start) && (millis() < end))
{ // do nothing }
}
else{
while ((millis() >= start) || (millis() < end))
{
// do nothing
};
}
}
Run Code Online (Sandbox Code Playgroud) 我想知道用C语言计算什么更好:
if (x==0)
{
// Some code ...
}
Run Code Online (Sandbox Code Playgroud)
的
if (0==x)
{
// Some code ...
}
Run Code Online (Sandbox Code Playgroud)
我知道最后一个更好,以防程序员忘记第二个“=”并写“0 = x”而不是“0 == x”,因为编译器会抛出错误。
但我的问题是:
我认为这与“左值”和“右值”有关,并且我尝试在我的电脑中进行模拟,但没有任何重要的见解。
只是想知道是否可能.如果是,除编译器仿真层之外还有其他方法吗?
谢谢
我尝试创建两个函数来分割字符串成为2部分,第一个函数我想得到字符串"模式1",从串口RX_IN_CHR_UART 变量时,填充数据如"模式1 34",第二个函数我想得到"34"
此函数获取字符串"模式1"
#define GET_MODE_X 6
#define GET_VALUE 4
const char RX_IN_CHR_UART[];
char* pod(char buf_Rx[])
{
int i=0;
char spn[GET_MODE_X]; // 7
for(i=0;i<GET_MODE_X;i++)
{
spn[i] = buf_Rx[i];
}
return Get_mode_x = spn;
}
Run Code Online (Sandbox Code Playgroud)
并且此函数获取字符串"34"
char* dop(char buf_Rx_val[])
{
int k=0;
char datasip[GET_VALUE]; //2
for(k=0;k<GET_VALUE;k++)
{
datasip[k] = buf_Rx_val[GET_MODE_X+k+1];
}
return (Get_val_mod = datasip);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试比较功能dop()使用if(dop(RX_IN_CHR_UART)=="34")它不起作用.
if(!strcmp(mode1,pod(RX_IN_CHR_UART))) // compare "Mode 1"
{
Send_teks("Mode 1 ->:"); // send to serial port
Send_teks(pod(RX_IN_CHR_UART));
Send_Char('\n');
Send_teks("Data …Run Code Online (Sandbox Code Playgroud) 我必须根据像83025(大于65535)这样的大数字的值来做一些事情.为此,我不能使用switch-case,因为它只使用最大值为255的整数参数.(或者至少这是我所知道的.但是我仍然尝试过编译但是switch-case不能正常工作. )
所以我想我会if-else if像下面这样制作一个梯子,但它看起来并不太优雅.
if ((refnum == 32120) ||
(refnum == 32075)) {
else if (refnum == 51036) {
else if ((refnum == 61024) ||
(refnum == 61060)) {
else if ((refnum == 71030) ||
(refnum == 71048)) {
else if ((refnum == 72012) ||
(refnum == 72024) ||
(refnum == 72048)) {
else if ((refnum == 81025) ||
(refnum == 81050) ||
(refnum == 81100)) {
else if ((refnum == 82012) ||
(refnum == 82024) ||
(refnum …Run Code Online (Sandbox Code Playgroud) 什么是在字节数组中分配一个double到8个字节的快速方法?
我有一个大约4k字节的字节数组,我试图从中取出8个字节并将其复制到一个double中.我试图避免memmove和memcpy出于速度原因,因为分配变量要快得多.我在嵌入式世界工作,任何其他快速实现都受到赞赏.
void foo(double *pdest)
{
// Try 1: I am using 1 element in the array, it won't work
*pdest = (double)p->stk[stkpos];
// Try 2: I am attempting to loose the single element element
*pdest = (double)((double*)&p->stk[stkpos]);
}
Run Code Online (Sandbox Code Playgroud)
这两种解决方案都没有对我有用,我不确定如何实现这一目标.
我使用GoogleTest,我想用#ifndef里面测试一些函数.
档案交流
bool myFunction() {
#ifndef FOO
return true;
#else
return false;
#endif
}
Run Code Online (Sandbox Code Playgroud)
是否可以在特定测试期间强制#undef?就像我可以在2个统计数据中测试函数(使用define和不使用).
嗨,我是嵌入式程序员。最近我们遇到一个项目,我们被迫使用多线程。我已经在 java 中使用了相同的代码,但我无法实现它我的 8051 嵌入式代码。任何人都可以帮助我吗?
我不知道是否有一个程序可以将ASM转换为C.我检查了谷歌,我已经读过IDA Pro可以做到但我不知道如何做.无论如何,你能帮我把这个用ASM编写的代码转换成C吗?我不擅长集会,所以我希望你能帮助我.谢谢 :)
这是代码:
#define CALIBRATIONTIME .10 ;Number Of Times To Measure Signal During Calibration
;**********************************************************************************************
;Calibrate() - Measures A Period From The Input(GP0) Reference Signal
; - Updates Osccal Value
; - Updates E^2
;**********************************************************************************************
CALIBRATE
movlw CALIBRATIONTIME
movwf COUNTER ;Calibration Counter
LOW0
btfsc INPUT0 ;Wait To Sample Low Edge #0 (Makes Sure We Are Synchronized First Time Through)
goto LOW0
HIGH1
btfss INPUT0 ;Wait To Sample High Edge #1
goto HIGH1
clrf TMR0 ;Start Timer (Timer Will Be …Run Code Online (Sandbox Code Playgroud)