Tag: iar

IAR为自定义数据定义内存区域

我想在STM32 micro中定义一个特定的内存区域来存储一些字符串。 我正在使用IAR编译器,但我找不到一个简单的例子,它可以帮助我使用icf文件以正确的方式创建区域。 如何创建区域并在代码中使用此区域? 谢谢

如何在IAR Embbedded Workbench中编译我的代码的两个版本

我有两个版本的代码,我需要切换它们,因为工作需要编译每个代码,同时在IAR项目上保留两个版本。 我找到类似“编译开关”的东西,但我不知道它是怎么做的。 是否有人告诉我可以搜索的关键字或建议?

不能使用IAR ARM编译器强制function表到特定地址

我有一个像这样定义的函数表类型 typedef struct { uint16_t majorRevision; uint16_t minorRevision; uint8_t (*CommInit)(void *); uint8_t (*CommDeInit)(void); uint16_t (*Write)(uint8_t *, uint16_t); uint16_t (*Read)(uint8_t *, uint16_t); uint8_t (*Attached)(void); uint8_t (*ExitApp)(uint8_t); uint8_t (*Jump)(uint32_t address); uint16_t (*GetCRC)(uint8_t*, uint32_t); int (*Encrypt)(uint8_t *, uint32_t); int (*Decrypt)(uint8_t *, uint32_t); uint8_t (*Reset)(void); uint32_t (*GetTickCount)(void); void (*Sleep)(uint32_t); uint8_t (*ReadASCIIByte)(void); uint16_t (*ReadASCIIWord)(void); uint32_t (*ReadASCIIDWord)(void); void (*WriteASCIIByte)(uint8_t); void (*WriteASCIIWord)(uint16_t); […]

有没有人为MSP430的IAR Embedded Workbench实现了__getzone()?

我不得不在我的应用程序中处理一些时间转换。 我想尽可能坚持使用标准库函数。 现在我使用time_t结构作为我的系统时基。 但是,某些设备可以将时间同步到我的设备,该时间可能是也可能不是UTC。 此外,我的设备将时间同步到另一台设备,该时间将始终为UTC。 无论如何,我可以询问用户什么时区是同步到我的设备的时间以及他们是否使用DST。 当我的设备获得时间同步时,我可以使用mktime直接生成我的时间戳(我的设备系统时间需要与他们为时间戳目的同步的时间相匹配,否则我必须不断进行转换),然后我可以如果我知道我的时间同步来自非UTC源,则使用gmtime()来获取UTC时间。 问题是默认情况下localtime()和gmtime()将返回相同的值,因为默认情况下库认为它是在UTC时间内,并且没有DST或时区偏移。 所以,我认为处理这个问题的方法是实现和覆盖库__getzone函数。 来自EW430_CompilerReference.pdf的第106页 要使__time32,__ time64和date函数有效,必须实现函数clock,__ time32,__ time64和__getzone。 无论使用__time32还是__time64取决于您用于time_t的接口,请参见time.h,第304页。 … __getzone的默认实现指定UTC(协调世界时)作为时区。 Q1:在我的推理中,我是否在正确的轨道上,做我想做的最好的方法是实现这个__getzone函数? 我跟踪的原因是因为__getzone返回的值是一个古怪的字符串w /格式如下: :[XXX [:YYY [:NNN [:DST [:DST …]]]]] 其中XXX是标准时区名称(例如,EST的GMT-5),YYY是夏令时时区名称(例如EST的GMT-4),NNN是UTC的formsHHMM的数字偏移(并且可以有 – 符号然后,DST为夏令时规则指定了一系列选项,这些规则有自己的恼人格式。 无论如何,这对我来说应该是非常直接的,因为我只担心具有相同DST规则的加拿大和美国。 Q2:有没有人有任何形成该字符串的示例代码,以便检查我对此的理解?

具有(带符号)枚举值的按位运算

我正在使用标志的枚举器值: typedef enum { a = 0x00, b = 0x01u, // the u has no influence, as expected c = 0x02u, // the u has no influence, as expected … } enum_name; volatile unsigned char* reg = SomeAddress; *reg |= b; 根据MISRA-C:2004,不应使用带符号的类型进行按位操作。 不幸的是,我的编译器IAR使用signed int(或short或char)作为枚举的基础类型,我能找到的唯一选项与大小有关,而不是签名(“–enum-is-int”)。

嵌入式C:注册访问

假设我们要写地址为0xc000 ,我们可以在C中定义一个宏: #define LCDCW1_ADDR 0xc000 #define READ_LCDCW1() (*(volatile uint32_t *)LCDCW1_ADDR) #define WRITE_LCDCW1(val) ((*(volatile uint32_t *)LCDCW1_ADDR) = (val)) 我的问题是,当使用任何微控制器时,请考虑一个示例MSP430,P1OUT寄存器地址为0x0021。 但是当我们使用P1OUT = 0xFFFF时; //它为P1OUT赋值0xFFFF。 我的问题是它是如何写入该地址的,例如在这种情况下为0x0021。 IDE是IAR。 我在头文件msp430g2553.h中找到了以下定义: #define P1OUT_ (0x0021u) /* Port 1 Output */ DEFC( P1OUT , P1OUT_) 我想它是定义地址,但其他宏写入或读取的位置。 任何人都可以解释P1OUT如何在该特定地址位置写入的流程? 另外请告诉我你在0x0021u中的含义是什么? 谢谢 到目前为止,我发现的细节是: 在msp430g2553.h中 #ifdef __IAR_SYSTEMS_ICC__ #include “in430.h” #pragma language=extended #define DEFC(name, address) __no_init volatile unsigned […]

FreeRTOS configTICK_RATE_HZ

我使用的是FreeRTOS版本5.4的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 […]