我目前正在开发一个嵌入式C项目,我"继承"了一些包含语句的旧代码,例如:
rxStruct = rxStruct;
Run Code Online (Sandbox Code Playgroud)
其中rxStruct是一个变量.
这些陈述有什么用?
我将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经验的人,他可能会提出一些建议,或者一些潜在的陷阱,我可能已陷入其中.
我目前正在使用 IAR Embedded Workbench 为 NXP LPC2378 micro 进行开发。我想我遇到了问题,因为 CPU 不断崩溃,我的 IRQ 和 CSTACK 需要更大,我注意到这些区域会“渗入”到周围的内存区域。我想我真的不明白这些和其他内存区域的用途是什么?我使用了一个 RTOS (CMX),它为 ISR 保留了 RAM,但这似乎是为了不同的东西。
当我使用 RTOS 时,IRQ_STACK、CSTACK、SVC_STACK、FIQ_STACK、UND_STACK 和 ABT_STACK 用于什么,或者它们是完全独立的东西?
我在一个受限制的嵌入式系统上工作.
目前我们使用snprintf缓冲区,然后使用另一个语句,将缓冲区打印到串口:
char temp_buffer[256];
int bytes_written = snprintf(temp_buffer, sizeof(temp_buffer),
"Solar system has %d planets\n",
10);
if (bytes_written > 0)
{
Serial_Port_Output(temp_buffer, bytes_written);
}
Run Code Online (Sandbox Code Playgroud)
我想切换到printf直接写入串口.根据我们的编译器文档,我拦截了函数调用以输出数据以使用串行端口.(接口使用块写入:地址和字符数).
该printf函数可以使用字符缓冲区进行格式化,例如整数或浮点到文本.
问题:
printf用于格式化的缓冲区在哪里?(在我做出改变之前,其他有探究的人都想知道.)平台:Arm7tdmi处理器,片上系统(SOC),IAR EW编译器.
我正在处理 IAR 项目,我的问题是 git 存储库可以忽略 IAR 项目中的哪个文件。所有项目设置文件和源文件混合在 git log 中非常无聊并且不利于版本控制,有人能提出好的建议吗?
太感谢了。
我正在使用基于微控制器STM32F401RET6的Nucleo F401Re板.我连接到主板上的Micro SD插槽,并有兴趣将数据写入SD卡并从中读取数据.我使用软件STM32CubeX生成代码,特别是带有内置函数的SD库.我试着编写一个简单的代码,将一个数组写入一个特定的数组,然后尝试读取相同的数据.代码如下:
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_SDIO_SD_Init();
char buffer[14] = "Hello, world\n";
uint32_t to_send[512] ; // Te
uint32_t to_receive[512];
uint64_t address = 150;
HAL_SD_WriteBlocks(&hsd, to_send, address, 512, 1);
HAL_SD_ReadBlocks(&hsd, to_receive, address, 512, 1);
while (1)
{
HAL_UART_Transmit(&huart2, (uint8_t *)buffer, 14, 1000);
HAL_UART_Transmit(&huart2, (uint8_t *)to_receive, 512, 1000);
}
Run Code Online (Sandbox Code Playgroud)
代码在函数HAL_Init()的中间停止,我收到以下消息:
The stack pointer …Run Code Online (Sandbox Code Playgroud) 我使用的是带有 5.4 版 FreeRTOS 的 MSP430f5438。
我有一个有趣的问题,我无法弄清楚。
基本上,当我将 configTICK_RATE_HZ 设置为不同的值时,LED 闪烁得更快或更慢;它应该保持相同的速率。我将 configTICK_RATE_HZ 设置得越高,它闪烁得越慢,而当我将 TICK_RATE 设置得越低时,它就会闪烁得越快。
vTaskDelayUntil( &xLastFlashTime, xFlashRate ); 无论 configTICK_RATE_HZ 是多少,LED 应该每秒只闪烁一次。我逐步检查了 xFlashRate 以进行确定。它总是 = configTICK_RATE_HZ。代码:
xFlashRate = ledFLASH_RATE_BASE;//my flash base rate is 1000ms
xFlashRate /= portTICK_RATE_MS; //so xFlashrate = whatever configTICK_RATE_HZ equals
/* We need to initialise xLastFlashTime prior to the first call to vTaskDelayUntil().*/
xLastFlashTime = xTaskGetTickCount();
for(;;) {
vTaskDelayUntil( &xLastFlashTime, xFlashRate ); vParTestToggleLED( uxLED );
flashled();//this should happen every 1 second.
}
Run Code Online (Sandbox Code Playgroud)
当我将 configtick_rate_hz 设置为 1000 …
我正在尝试使用IAR工具批量构建项目.处理器是CC2530,它在IDE中构建良好.我已经按照批量构建(项目/批量构建)的文档进行操作,并创建了一个.cspy文件,该文件假定是我的批处理文件,但在该文件的注释中,它表明我需要一个调试文件(.ubrof)来执行用它.我找不到.ubrof文件,我搜索了整个项目目录结构.另外,我希望我的批量构建能够在没有调试信息的情况下构建生产版本.
我在哪里可以获得.ubrof文件?如何使用IAR工具进行生产批量构建?
IAR 中是否有可能添加额外的项目变量,例如$PROJ_DIR$指定我的项目环境?
我喜欢让我的项目保持便携性和适应性。