Jone
Jone
写了还是懒

注册于 1 year ago

回答
213
文章
0
关注者
4

一般情况mcu代码是在flash里执行的,为了提高速度会将部分代码搬到ram中运行,也有全部搬到ram中的。

分散加载脚本是keil中的叫法,GNU里用的链接脚本,可以把flash或者ram划分片区(类似windows电脑把一整块硬盘分成C、D、E多个盘),编译的时候指定代码放置的区域;

另外外挂的ram或者flash要映射为芯片片内地址的时候就需要修改链接脚本来指定地址

未初始化的变量要放bss里面才不会占用空间。否则bin文件随变量的大小变化,另外如果ram地址不连续且间隔特别大的话回编译出几百M甚至上G的bin文件

看下我之前的怎么添加BSS段
前面是实验,后面是验证过的方法,倒着看吧节省时间

如你所述非常对
dma的接收缓存与应用层read时的数据源至同一缓存

  1. RT-Thread Studio调用的ST-Link烧录工具是命令行版本的STM32CubeMX Programmer,这个工具会识别芯片型号,非ST的不让用。
  2. Keil调用的Stlink烧录驱动是不识别芯片的,非ST家的芯片也能用

可以把RT-Thread Studio上的烧录工具选项改为DAP LINK就可以用Stlink对非st芯片进行烧录和仿真了

加保护了是吧,用Stm32CubeProgrammer修改选项字节
image.png

rtt不少api会阻塞,中断中使用不安全。
可以在中断中发送信号,在其他线程中处理事务

rtt是这样用的,结构体里面插入链表,通过链表在结构体的地址偏移量反推出链表成员和结构体成员。
下面的单向链表的一个简单示例:

typedef struct
{
    int len;
    char *data;
    rt_slist_t list;
} list_test_t;

int main(void)
{
    list_test_t head;
    list_test_t *node;
    
    //初始化链表头
    rt_slist_init(&sms_list.list);
    
    //定义链表2、3
    list_test_t *l2 = malloc(sizeof(list_test_t));
    list_test_t *l3 = malloc(sizeof(list_test_t));
    
    //附加到链表中
    rt_slist_append(&head.list, &l2->list);
    rt_slist_append(&head.list, &l3->list);
    
    //取L2值
    node = rt_slist_entry(&l2->list, list_test_t, list);
    printf("Len: %d\r\n", node->len);
    
    //删除指定链表
    rt_slist_remove(&head.list, &l2->list);
    
    //另外就是遍历/插入/获取首、尾链表等等
}

问题1

192Kb是sram总大小

代码编译后ram被编译器分成堆、栈两部分,堆用来进行动态分配(malloc),而代码中已定义的变量的空间来自栈。
堆和栈在编译的时候确定大小,free命令查到的是的大小。

问题2

lds文件中增加的ccmram可以用来指定变量存放位置:

char buffer[1024] SECTION(".ccmram");

根据buffer地址判断是否在ccram地址范围内

用法不对,正确的使用方式要分两步:

  1. 收到rn结尾的URC后可以解析出剩余数据长度
  2. 调用at_client_recv()接收剩余的数据

at_client.c中看client_parser()接口
image.png
先按行读数据,然后判断是不是urc,不是urc的话行号++

FAL组件分区,流程大概是这样的

fal_cfg.h//配置分区

/*初始化*/
fal_init();    
//创建设备
fal_mtd_nor_device_create();
//挂载
dfs_mount();

image.png
image.png

软件包里开启AT Client,勾选要操作的设备后AT Socket自动开启,此时kawaii_mqtt调用的socket接口自动就是AT Client封装的了。

如果你还开启了其他socket协议(比如lwip),在创建socket时要选择AT Socket 协议栈,详见https://www.rt-thread.org/document/site/programming-manual/sal/sal/

反复启动是指重复调用rt_timer_start()吗?如果是这样的话是从头开始

回到
顶部

发布
问题

投诉
建议