【问题标题】:utf-8 strings in program memory (__flash)程序内存中的 utf-8 字符串 (__flash)
【发布时间】:2020-08-19 13:13:44
【问题描述】:

我正在尝试从程序内存中读取和打印 avr 中的 unicode 字符串(希腊语), 我正在使用 __flash 属性,但我的字符串损坏了。例如:而不是 ΧΡΗΣΤΗ 我得到 ΧΡΤ⸮⸮,英语似乎以某种方式工作。

我就是这样做的:

在 Print_menu_file.c 中:

static const __flash char * const __flash *Unicode_text;

const __flash char * const __flash Greek_text[35]=
{
    (const __flash char[40]) { "ΜΕΝΟΥ ΧΡΗΣΤΗ"     }, //USER_MENU
    (const __flash char[]) { "ΡΥΘΜΙΣΗ ΗΜΕΡ/ΩΡΑΣ" }, //SET_DATE_TIME
    (const __flash char[]) { "ΠΡΟΒ. ΑΙΣΘΗΤΗΡΩΝ"  }, //SHOW_SENSRORS
    (const __flash char[]) { "ΘΕΡΜΟΚΡΑΣ. 1/2"    }, //TEMP_1_OF_2
}

void Print_string(void)
{
 char* string=0;
 Unicode_text=Greek_text;
 strcpy_P(string,Unicode_text[1]);

 lcd_print_unicode(string);
}

【问题讨论】:

  • 您将未初始化变量 (string) 的值传递给 strcpy_P。您也没有显示 Unicode_text 在使用之前被初始化。
  • 我修复了字符串 init,在 strcpy 之前仍然不满意 "Unicode_text=Greek_text",我现在将编辑它
  • strcpy_P(0, Unicode_text[1]) aka strcpy_P(NULL, Unicode_text[1]) 真的对你有意义吗?
  • /** \ingroup avr_pgmspace \fn char *strcpy_P(char *dest, const char *src) 好吧,因为“string”是目标指针,它确实
  • 你知道x = 2; y = x + 3; 也可以写成y = 2 + 3;。好吧,string = 0; strcpy_P(string, Unicode_text[1])strcpy_P(0, Unicode_text[1]) 是一回事。你没有通过string;传递变量的概念甚至不是一回事。传递的指针是存储在string 中的指针,即0 又名NULL,它不是有效的目标指针。你在做strcpy_P(0, Unicode_text[1]) aka strcpy_P(NULL, Unicode_text[1]),这没有任何意义。

标签: c string unicode embedded avr


【解决方案1】:

正如 ikegami 的评论所暗示的,你的问题在于这段代码:

void Print_string(void)
{
 /////problem below//////
 char* string=0;
 /////problem above/////

 Unicode_text=Greek_text;
 strcpy_P(string,Unicode_text[1]);

 lcd_print_unicode(string);
}

您有一个指向 0 的字符缓冲区的指针。现在,0 可能是为您的目标 strcopy 分配的缓冲区,但很可能不是(它可能是向量表)。

strcpy_P 不会为您分配缓冲区。它只写入您提供的指针的缓冲区。

制作

char * string=0;

进入

char string[MAX_EXPECTED_STRING_LENGTH_PLUS_TERMINATING_0];

您的问题将得到解决。

【讨论】:

  • AVR 是一种哈佛架构,代码始终从 Flash 运行,无法通过像 strcpy_P 用于写入其目标的正常内存访问来写入。所以代码地址 0 位于 Flash 中,并且是向量表通常所在的位置。但是,strcpy_P(0, ...) 会将字符串写入数据地址 0。这将覆盖恰好存储在数据地址 0 的任何数据,并且该数据的一部分可能会在 lcd_print_unicode() 之前被 strcpy_Plcd_print_unicode() 覆盖从地址 0 之后的字符串字节中读取。
猜你喜欢
  • 2019-08-08
  • 1970-01-01
  • 2019-12-16
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 2015-01-19
  • 1970-01-01
相关资源
最近更新 更多