- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试将一些可怕的混淆代码从 Codewarrior 移植到 Crossworks。这些库是用 C 语言编写的,但我认为是在尝试模仿 C++ 对象。
当声明这些对象时,它们是通过使用宏的宏来完成的,这些宏使用宏,这使得很难遵循!我使用预处理器扩展了它们,使其更容易理解。
现在,在基于 [working] Codwarrior Eclipse 的系统下,有一段文本,在源代码中指定为 static const,最终出现在 RAM 中。据我所知,链接器将其他指定为静态常量的内容放入闪存中。在 Crossworks 中,一切都在闪光中结束——这对我来说很有意义。
这是从宏展开后有问题的声明的一个示例:
static const D4D_LABEL scrSplash_lblSID_params
= { { " Unit ID: 42949672955" , sizeof(" Unit ID: 42949672955"), 0, &scrSplash_lblSID_strPrties}, { 6, 76 }, { 118, 16 }, 8 };
D4D标签定义如下:
typedef struct
{
D4D_STRING textBuff; // label text
D4D_POINT scrPos; // position on the screen
D4D_SIZE scrSize; // size on the screen (focus rect only, bitmaps have own size)
D4D_COOR radius; // corner radius
} D4D_LABEL;
D4D_STRING 定义如下:
typedef struct D4D_STRING_S
{
char *pText;
D4D_INDEX buffSize;
D4D_FONT fontId;
D4D_STR_PROPERTIES *str_properties;
D4D_INDEX printLen;
D4D_INDEX printOff;
}D4D_STRING;
此 D4D_LABEL 按如下方式放入 D4D_OBJECT:
const D4D_OBJECT scrSplash_lblSID = { (void*)&(scrSplash_lblSID_params), (D4D_OBJECT_SYS_FUNCTION*)&d4d_labelSysFunc,
(void*)0, (void*)0, (0x01 | 0x02 | 0x40), &(scrSplash_lblSID_flags), (void*)0, &(scrSplash_lblSID_pScreen) };
D4D_OBJECT 是这样定义的:
// this is allocated in ROM always
typedef struct D4D_OBJECT_S
{
void* pParam;
D4D_OBJECT_SYS_FUNCTION* pObjFunc;
Byte (*OnUsrMessage)(struct D4D_MESSAGE_S* pMsg);
void *userPointer;
D4D_OBJECT_INITFLAGS initFlags;
D4D_OBJECT_FLAGS* flags;
struct D4D_CLR_SCHEME_S* clrScheme;
struct D4D_SCREEN_S** pScreen;
} D4D_OBJECT;
据我所知,首先放入 D4D_OBJECT scrSplash_lblSID 的是指向 D4D_LABEL scrSplash_lblSID_params 的指针。该 D4D 标签被声明为静态常量,因此放入闪存中。 Crossworks 做到了这一点,而 Codewarrior 在 RAM 中拥有它。
当使用这个函数时:
void D4D_SetText(D4D_OBJECT_PTR pObject, char* pText)
{
D4D_STRING* p_TextBuff = NULL;
if(pObject->pObjFunc->GetTextBuffer)
p_TextBuff = pObject->pObjFunc->GetTextBuffer((D4D_OBJECT*)pObject);
// ABOVE line equates to: return &(((D4D_LABEL*)((pThis)->pParam))->textBuff);
if(p_TextBuff)
{
D4D_ChangeText(p_TextBuff, pText, 0);
D4D_InvalidateObject(pObject, D4D_FALSE);
}
}
通过以下行:
D4D_SetText(&scrSplash_lblSID, SIdString);
p_TextBuff 在Codewarrior 中是一个RAM 位置,在Crossworks 中是一个flash 位置。 ChangeText 函数试图将 pText 指向的字符串复制到闪存中,当然,处理器(Freescale 的 Cortex M4 - Kinetis 处理器)崩溃了!
以上信息是否足以给我提供建议?我猜 Codewarrior 项目的链接器文件中有一些东西设法使相关字符串最终出现在 RAM 中而不是闪存中。我看不出链接器如何神奇地知道将静态常量放入 RAM 而不是像其他东西一样闪烁!
链接器文件位于下方,以防它可能相关。
非常感谢!
# Default linker command file.
MEMORY {
m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x000001E0 # Interrupts
m_text (RX) : ORIGIN = 0x00004400, LENGTH = 0x0003BC00 # Code and read only data
m_data (RW) : ORIGIN = 0x1FFF0000, LENGTH = 0x00020000 # Read/write data
}
KEEP_SECTION { .vectortable }
KEEP_SECTION { .cfmconfig }
SECTIONS {
.interrupts :
{
__vector_table = .;
* (.vectortable)
. = ALIGN (0x4);
} > m_interrupts
# All the stuff that lives in flash: the application (.text), read only data (.rodata) and .init - whatever the latter is
.app_text:
{
ALIGNALL(4);
* (.init)
* (.text)
.= ALIGN(0x8) ;
* (.rodata)
.= ALIGN(0x4) ;
___ROM_AT = .;
} > m_text
# App data is INITIALISED data. So stuff that was specified in flash, but gets copied to RAM at boot
.app_data: AT(___ROM_AT)
{
* (.sdata)
* (.data)
.= ALIGN(0x4) ;
*(.ARM.extab)
.= ALIGN(0x4) ;
__exception_table_start__ = .;
EXCEPTION
__exception_table_end__ = .;
.= ALIGN(0x4) ;
__sinit__ = .;
STATICINIT
.= ALIGN(0x8) ;
} > m_data
# .bss is UNINITIALISED data that just lives in normal RAM - after the initialised stuff
.bss :
{
.= ALIGN(0x4) ;
__START_BSS = .;
* (.bss)
__END_BSS = .;
.= ALIGN(0x8) ;
} >> m_data
_romp_at = ___ROM_AT + SIZEOF(.app_data);
.romp : AT(_romp_at)
{
__S_romp = _romp_at;
WRITEW(___ROM_AT);
WRITEW(ADDR(.app_data));
WRITEW(SIZEOF(.app_data));
WRITEW(0);
WRITEW(0);
WRITEW(0);
}
__SP_INIT = . + 0x00008000;
__heap_addr = __SP_INIT;
__heap_size = 0x00008000;
}
最佳答案
对象声明为static const
是无关紧要的;您要写入的字符串是 D4D_STRING
中的指针:
typedef struct D4D_STRING_S
{
char *pText;
这是从字符串文字 "Unit ID: 42949672955"
初始化的,写入字符串文字是未定义的行为。
如果您的编译器接受-fwritable-strings
选项(gcc 4.0 之前的版本,clang 的某些版本),那么您可以使用该选项将字符串文字放入RAM。首选的替代方法是使用可变字符缓冲区:
char scrSplash_lblSID_params_text[] = " Unit ID: 42949672955";
关于c - 声明为 static const 的结构如何在 RAM 中结束? (在 C 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16648968/
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!