我玩WoW大约2年了,我对用来写插件的Lua很好奇.因为到目前为止我所读到的Lua是"快速","轻盈"和"这很棒",我想知道如何以及何时使用它.
您需要在系统中嵌入像Lua这样的脚本语言的典型情况是什么?
为什么这段代码会崩溃?strcat在字符指针上使用非法?
#include <stdio.h>
#include <string.h>
int main()
{
char *s1 = "Hello, ";
char *s2 = "world!";
char *s3 = strcat(s1, s2);
printf("%s",s3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请在引用数组和指针时给出正确的方法.
我目前正在做一个*咳嗽*Oracle*咳嗽*数据库主题.讲师将介绍嵌入式SQL作为您使用其他语言(例如C,C++)与(Oracle)数据库交互的方式.
我自己做了一些数据库工作(在mysql上)我使用动态sql.
由于嵌入式SQL似乎仅限于几个Oracle和其他几个,所以这更像是锁定的尝试,还是嵌入式SQL中的真正价值?
编辑:我刚刚意识到,在PL/SQL课程结束后,本课程是正确的.
原始问题询问参数化SQL(现在用"动态sql"代替以改进问题).
旁白:我认为我买的约30美元的"SQL和关系理论"一书教我的不仅仅是这个数据库类.
我有一个问题,非可移植代码在ARM RealView编译器上按预期工作,但VC++,GCC拒绝编译它,QAC++(静态分析工具)发出警告.
我有一个系统需要解析消息中的助记符标识符.助记符都是三个字符的8位ASCII字符串.为了简化和优化解析而不是对助记符字符串执行字符串比较,我将字符串打包成32位整数并执行整数比较.
此外,为了能够使用switch/case而不是if-elseif链,我有一个宏,它接受一个文字字符串并生成相关的整数,在ARM RealView中是一个编译时常量,但不是在GCC x86/Linux或VC++/Windows:
// Note: Do not change C cast to static_cast because compiler complains when used in switch/case
#define CONST_MNEMONIC( mn ) ((uint32_t)(((#mn)[2]<<16)|((#mn)[1]<<8)|((#mn)[0])))
Run Code Online (Sandbox Code Playgroud)
然后将其用于ARM目标代码,如下所示:
switch( packed_mnemonic )
{
case CONST_MNEMONIC(RST) :
...
break ;
case CONST_MNEMONIC(SSD) :
...
break ;
case CONST_MNEMONIC(DEL) :
...
break ;
default:
...
break ;
}
Run Code Online (Sandbox Code Playgroud)
案例标签当然必须是编译时常量,但显然所有编译器都不是这样.代码是不可移植的,我想是未定义或实现定义的行为,或者只是错误!
明显的便携式解决方案存在效率和可维护性的缺点,因此我有两个问题:
为什么这段代码不可移植 - 是什么让宏在某些编译器中的编译时间不变?
是否有便携式解决方案从助记符字符串生成所需的编译时间常量?
我目前正在开发一个使用ARM Cortex M3微控制器和FreeRTOS作为系统操作系统的嵌入式项目.代码是由一位前同事编写的,遗憾的是该项目有一些奇怪的错误,我必须尽快找到并修复.
简短说明:该设备集成到车辆中,并使用集成调制解调器向远程服务器发送一些"特殊"数据.
主要问题:由于设备集成在车辆中,设备的电源可能随时丢失.因此,设备将"特殊"数据的某些部分存储到两个保留的闪存页面.此代码模块在两个闪存页面上作为eeprom仿真进行布局(用于从一个闪存页面到另一个闪存页面的耗损均衡和数据传输).eeprom仿真与所谓的"虚拟地址"一起使用,您可以在其中将任意大小的数据块写入当前活动/有效的闪存页面,并使用这些虚拟地址将其读回.前同事将eeprom仿真实现为多任务模块,您可以从应用程序中的每个任务读取/写入闪存页面.乍一看,一切似乎都很好.
但是我的项目经理告诉我,设备总是会丢失一些"特殊"数据,车辆中的电源电压下降到几伏,设备会尝试将数据保存到闪存中.通常电源大约为10-18伏,但如果电压降至7伏以下,则设备会收到一个被调用的中断powerwarn,并触发一个叫做的任务powerfail task.它powerfail task具有所有任务的最高优先级,并执行一些回调,例如调制解调器关闭,以及"特殊"数据存储在闪存页面中.我试着理解代码并调试了几天/几周,现在我很确定我发现了问题:
在powerfail任务执行的那些回调(称为powerfail回调)中,有RTOS调用,其他任务被暂停.但不幸的是,那些被填充的任务也可能EEPROM_WriteBlock()在接收到电源警告中断之前有一个未完成的呼叫.因此,powerfail任务执行回调,并且在其中一个回调中有一个EE_WriteBlock()调用,其中任务无法接受互斥锁,EE_WriteBlock()因为另一个任务(已暂停)已经采取了 - >死锁!
这是将数据写入闪存的例程:
uint16_t
EE_WriteBlock (EE_TypeDef *EE, uint16_t VirtAddress, const void *Data, uint16_t Size)
{
.
.
xSemaphoreTakeRecursive(EE->rw_mutex, portMAX_DELAY);
/* Write the variable virtual address and value in the EEPROM */
.
.
.
xSemaphoreGiveRecursive(EE->rw_mutex);
return Status;
}
Run Code Online (Sandbox Code Playgroud)
当调用'xSemaphoreTakeRecursive()'时,这是RTOS特定的代码:
portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle pxMutex, portTickType xBlockTime )
{
portBASE_TYPE xReturn;
/* Comments regarding mutual exclusion as per those …Run Code Online (Sandbox Code Playgroud) 我想调试我的代码并且无法访问过程中的内部层,因为这会干扰与硬件的通信。(在监视列表会干扰基本读取访问的地方执行易失性操作。)
所以我正在测试接口的返回值,但 IAR 编译器甚至优化了未使用的 volatile 变量。
和这样的声明:
i = object.foo();
if (i)i=i;
Run Code Online (Sandbox Code Playgroud)
也没有帮助。
我在这里找到了 SO 只是回答了该案例使用 i/o 操作的建议。但这也不是选项,因为我没有包含 C 标准库的选项。并且项目本身不需要输入/输出,没有自己的输入/输出功能变体。
那么除了禁用优化器之外,我还有哪些选择?
我了解 C 中的类型转换在高层次上所做的事情。我知道有时这是隐式完成的,有时需要明确完成。但是我不知道这是如何在低级别发生的:
假设GetSignal返回一个enum类型。
uint8 outValue;
f32_t iValue;
iValue = (f32_t)GetSignal();
outValue = (uint8)((i32_t)iValue);
Run Code Online (Sandbox Code Playgroud)
我的问题是这里发生了什么。我不知道在所有这些类型转换之后如何重新组织这些位。
我正在为不同的硬件(avr,arm7,tms55xx ......)和不同的rtoses(freeRTOS,rtx,dsp/bios)编写嵌入式应用程序.而且他们每一秒都需要与PC或其他数字设备进行通信.有时,交互逻辑非常先进.所以我对常用的方法(如状态机编程风格),协议规范或库感兴趣,可以简化开发这样的事情.
我正在使用带有STM32_USB-FS-Device_Lib_V3.2.1 USB库的STM32F105微控制器,并根据我们的目的调整了VCP示例(与RTOS和串行API集成).
问题是如果连接了USB电缆,但是Windows主机上没有打开端口,几分钟后设备会永久重新进入USB ISR,直到端口打开然后一切正常开始工作.
我已经检测了中断处理程序并且可以看到当故障发生时,ISR处理程序退出然后立即重新进入.发生这种情况是因为在退出中断时,OTG_FS_GINTSTS中的IEPINT标志不清楚.此时OTG_FS_DAINT包含0x00000002(IEPINT1设置),而DIEPINT1包含0x00000080(TXFE).调用清除TXFE的OTGD_FS_Handle_InEP_ISR()中的行,但该位不清除或立即重新置位.当主机上的COM端口重新打开时,中断结束时OTG_FS_GINTSTS和OTG_FS_DAINT的状态始终为零,并且以正常速率发生进一步的中断.请注意,只有在输出数据但主机没有打开端口时才会出现此问题.如果端口打开或没有输出数据,系统将无限期运行.我相信输出的数据越多,问题就越早出现,但目前这是轶事.
VCP代码有一个状态变量,它接受以下枚举值:
UNCONNECTED,
ATTACHED,
POWERED,
SUSPENDED,
ADDRESSED,
CONFIGURED
Run Code Online (Sandbox Code Playgroud)
我们使用CONFIGURED状态来确定是否将数据放入驱动程序缓冲区以进行发送.但是,当连接电缆而不是主机打开端口并连接应用程序时,将设置CONFIGURED状态.我看到当Windows打开端口时,会出现一连串的中断,所以似乎在这个事件上发生了一些通信; 我想知道是否有可能检测主机是否打开了端口.
我或许需要两件事之一:
我有一个使用Visual Studio Qt加载项的Visual Studio Qt项目.外接程序自动为.ui文件和每个头文件创建一个自定义构建工具规则,该头文件具有带有Q_OBJECT声明的类,分别运行UIC和MOC.
这一切都完美无缺,直到我为整个项目添加自定义构建工具规则.在此实例中,该规则特定于Release构建并调用代码签名,并设置为Execute after:Build.使用此配置,Debug构建正常工作,但Release不会自动执行MOC或UIC.我可以在项目浏览器中右键单击Q_OBJECT标头和.ui文件,并手动强制编译所有必需的文件,然后它们正确MOC和UIC,然后可以构建,但是清理后重建或构建总是失败.
为什么添加项目项目的自定义生成规则似乎已禁止关联.ui和Q_OBJECT标题的自定义生成工具规则?