我尝试使用DMA通道使用SPI发送数据.当我在没有DMA的情况下发送一切都没问题,但是用DMA确实是错误的.当我调试我的程序时,SPI DR寄存器始终为0.我想使用dma循环模式一直发送我的数组.有我的代码GPIO INIT:
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(SPI_PERIPH_CLOCK, ENABLE);
RCC_AHBPeriphClockCmd(GPIO_PERIPH_CLOCK, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
GPIO_PinAFConfig(GPIOB, AF_PIN_SOURCE, GPIO_AF);
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
Run Code Online (Sandbox Code Playgroud)
SPI INIT
SPI_I2S_DeInit(SPI1);
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
Run Code Online (Sandbox Code Playgroud)
DMA INIT:
DMA_InitTypeDef dma;
DMA_DeInit(DMA1_Channel1);
DMA_StructInit(&dma);
dma.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;
dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
dma.DMA_PeripheralDataSize …Run Code Online (Sandbox Code Playgroud) 所以我的问题是:为什么在编译命令末尾需要“ -lpthread”?
为什么此命令起作用:
gcc -o name name.c -lpthread
Run Code Online (Sandbox Code Playgroud)
但这不会:
gcc -o name name.c
Run Code Online (Sandbox Code Playgroud)
我在我的C代码中使用了pthread.h库。
我已经在网上寻找一些答案,但并没有真正找到可以理解的答案
我有一个 int32_t 号,我需要检查它是否适合 int8 和 in16,但是当我尝试时:
if (number ==(int32_t)((int8_t) number)) {
printf("%s %d\n","8", number);
} else if (number ==(int32_t)((int16_t) number)){
printf("%s %d\n","16", number);
Run Code Online (Sandbox Code Playgroud)
编译器说第一个 if 语句总是正确的,但我不知道如何以其他方式做到这一点,只使用“==”和诸如 << >> 之类的位操作。和 <stdint.h>。
我只是想知道为什么存在这些不同的开始标签,如果还有更多,并且它们是否可以互换使用:
<%# Do.Something() %>
<%= Do.Something() %>
...
Run Code Online (Sandbox Code Playgroud) 我怎么写一个位?我有一个1或0的变量,我想将其值写入8位reg变量中的单个位.
我知道这会设置一下:
reg |= mask; // mask is (1 << pin)
Run Code Online (Sandbox Code Playgroud)
这将清楚一点:
reg &= ~mask; // mask is (1 << pin)
Run Code Online (Sandbox Code Playgroud)
有没有办法让我在一行代码中执行此操作,而无需确定值是高还是低作为输入?
我读的地方,发生违约浮点值一样1.2都double没有float.
那么什么是默认的整数值,比如6,是short , int 还是 long?
以下代码的输出为4000;如果具有互斥锁的线程不释放它,为什么是4000。我虽然会陷入僵局,但主要是我等待所有功能完成。
int M = 1000;
HANDLE mutex;
DWORD WINAPI thread_function(LPVOID param) // The thread function
{
long aux;
WaitForSingleObject(mutex, INFINITE);
for (int i = 0; i < M; i++)
{
aux = count; //count is global
aux++;
Sleep(0.5);
count = aux;
}
/*ReleaseMutex(mutex);*/
return (DWORD)0;
}
int main()
{
int N = 4;
InitializeCriticalSection(&gSection);
HANDLE* iThread = (HANDLE*)malloc(N * sizeof(HANDLE));
mutex = CreateMutex(NULL, FALSE, NULL);
for (int i = 0; i < N; i++) // N = 4, i create …Run Code Online (Sandbox Code Playgroud) 类似函数的宏是
#define ARRAYSIZE(_Array) ((sizeof(_Array)) / (sizeof(_Array[0])))
Run Code Online (Sandbox Code Playgroud)
显示的错误是:
错误[Pm154]:在类函数宏的定义中,参数的每个实例都应括在括号中(MISRA C 2004 规则 19.10)
根据this answer,以下是标准中描述的序列点:
在函数调用和实际调用中的函数指示符和实际参数的评估之间;
在运算符 &&、|| 和 , 的第一个和第二个操作数的计算之间;
在条件 ?: 运算符的第一个操作数的评估与第二个和第三个操作数中的任何一个评估之间;
完整声明符的结束;
在完整表达式的求值和要求值的下一个完整表达式之间。以下是完整的表达:
在库函数返回之前;
在与每个格式化输入/输出函数转换说明符相关联的动作之后;
在每次调用比较函数之前和之后,以及在对比较函数的任何调用和作为参数传递给该调用的对象的任何移动之间。
该标准从未明确提到分号是一个序列点,但是已经说明的各种序列点暗示分号确实是一个序列点。
那么,分号是在break;还是continue;序列点中?