Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
wlof
这个家伙不懒,什么也没写
注册于 7年前
回答
64
文章
16
关注者
6
关注TA
向TA提问
发私信
TA的回答
问
RT-Thread为什么这么这么推崇IAR和Keil等收费软件?
发布于3年前
凡是国外禁止的,都会做得很好,比如原子弹、空间站等。 MDK放出来,让我们使习惯了,有依赖和惰性,然后我们就不会用自己的了。自己国产的,就会默默的死掉了,没有人用,没有人发现问题提问题,更没有人解决问题和改进。 国产化要走的路很长,肯定会优先解决大部份开发者的需求,有了用户群体了,自然也就有了改进的动力。特别是在和MDK/IAR这些巨头抢占客户群的情况下,挺难的。关于windows这个估计也是考虑到了用户群体的问题。 不在windows下做开发的,给俺第一感觉就是一个高手。所以,也希望作者不要心急,问题肯定会得到解决的,只是时间的问题,同时也希望您能为RTT的改进和提升提供支持。
问
STM32L0 drv_usart.c的BUG及解决【已解决】
发布于4年前
在stm32L071RB上测试通过,其他的板子没有测试 ### 修改后的函数: ``` static rt_err_t stm32_gpio_configure(struct stm32_uart_config *config) { #define UART_IS_TX (1U<<7) #define UART_IS_RX (0U) rt_uint16_t tx_pin_num = 0; int index = 0, tx_af_num = 0, rx_af_num = 0; uint8_t uart_num = 0; GPIO_TypeDef *tx_port; GPIO_TypeDef *rx_port; uint16_t tx_pin; uint16_t rx_pin; get_pin_by_name(config->rx_pin_name, &rx_port, &rx_pin); get_pin_by_name(config->tx_pin_name, &tx_port, &tx_pin); struct gpio_uart_af { /* index get by GET_PIN */ uint16_t pin_index; struct { /* when is TX the bit7 is 1, bit6-bit0 is uart number (1-8) */ uint8_t uart_num; uint8_t af_num; } afs[1]; }; static const struct gpio_uart_af uart_afs[] = { { .pin_index = GET_PIN(A, 0), .afs[0] = {.uart_num = UART_IS_TX|4, .af_num = 6}}, { .pin_index = GET_PIN(A, 1), .afs[0] = {.uart_num = UART_IS_RX|4, .af_num = 6}}, { .pin_index = GET_PIN(A, 2), .afs[0] = {.uart_num = UART_IS_TX|2, .af_num = 4}}, { .pin_index = GET_PIN(A, 3), .afs[0] = {.uart_num = UART_IS_RX|2, .af_num = 4}}, { .pin_index = GET_PIN(A, 9), .afs[0] = {.uart_num = UART_IS_TX|1, .af_num = 4}}, { .pin_index = GET_PIN(A, 10), .afs[0] = {.uart_num = UART_IS_RX|1, .af_num = 4}}, { .pin_index = GET_PIN(A, 14), .afs[0] = {.uart_num = UART_IS_TX|2, .af_num = 4}}, { .pin_index = GET_PIN(A, 15), .afs[0] = {.uart_num = UART_IS_RX|2, .af_num = 4}}, { .pin_index = GET_PIN(B, 3), .afs[0] = {.uart_num = UART_IS_TX|5, .af_num = 6}}, { .pin_index = GET_PIN(B, 4), .afs[0] = {.uart_num = UART_IS_RX|5, .af_num = 6}}, { .pin_index = GET_PIN(B, 6), .afs[0] = {.uart_num = UART_IS_TX|1, .af_num = 0}}, { .pin_index = GET_PIN(B, 7), .afs[0] = {.uart_num = UART_IS_RX|1, .af_num = 0}}, { .pin_index = GET_PIN(C, 1), .afs[0] = {.uart_num = UART_IS_TX|1, .af_num = 6}}, { .pin_index = GET_PIN(C, 0), .afs[0] = {.uart_num = UART_IS_RX|1, .af_num = 6}}, { .pin_index = GET_PIN(C, 10), .afs[0] = {.uart_num = UART_IS_TX|4, .af_num = 6}}, { .pin_index = GET_PIN(C, 11), .afs[0] = {.uart_num = UART_IS_RX|4, .af_num = 6}}, { .pin_index = GET_PIN(C, 12), .afs[0] = {.uart_num = UART_IS_TX|5, .af_num = 2}}, #ifdef GPIOD { .pin_index = GET_PIN(D, 2), .afs[0] = {.uart_num = UART_IS_RX|5, .af_num = 6}}, { .pin_index = GET_PIN(D, 5), .afs[0] = {.uart_num = UART_IS_TX|2, .af_num = 0}}, { .pin_index = GET_PIN(D, 6), .afs[0] = {.uart_num = UART_IS_RX|2, .af_num = 0}}, #endif #ifdef GPIOE { .pin_index = GET_PIN(E, 8), .afs[0] = {.uart_num = UART_IS_TX|4, .af_num = 6}}, { .pin_index = GET_PIN(E, 9), .afs[0] = {.uart_num = UART_IS_RX|4, .af_num = 6}}, { .pin_index = GET_PIN(E, 10), .afs[0] = {.uart_num = UART_IS_TX|5, .af_num = 6}}, { .pin_index = GET_PIN(E, 11), .afs[0] = {.uart_num = UART_IS_RX|5, .af_num = 6}}, #endif }; /* get tx/rx pin index */ uart_num = config->name[rt_strlen(config->name)-1] - '0'; tx_pin_num = stm32_get_pin(tx_port, tx_pin); for (index = 0; index < sizeof(uart_afs) / sizeof(struct gpio_uart_af); index = index + 2) { if (uart_afs[index].pin_index == tx_pin_num) { if(uart_afs[index].afs[0].uart_num == (uart_num|UART_IS_TX)) { tx_af_num = uart_afs[index].afs[0].af_num; rx_af_num = uart_afs[index + 1].afs[0].af_num; } } } /* gpio Init */ GPIO_InitTypeDef GPIO_InitStruct = {0}; /* gpio ports clock enable */ stm32_gpio_clk_enable(tx_port); if (tx_port != rx_port) { stm32_gpio_clk_enable(rx_port); } /* rx pin initialize */ GPIO_InitStruct.Pin = tx_pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; #if defined(SOC_SERIES_STM32L0) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32H7) GPIO_InitStruct.Alternate = tx_af_num; #endif HAL_GPIO_Init(tx_port, &GPIO_InitStruct); /* rx pin initialize */ GPIO_InitStruct.Pin = rx_pin; #if defined(SOC_SERIES_STM32L0) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32H7) GPIO_InitStruct.Alternate = rx_af_num; #endif HAL_GPIO_Init(rx_port, &GPIO_InitStruct); return RT_EOK; } ```
问
【已解决】bootloader跳转后,内存申请函数失败
发布于5年前
找了很多资料,东搞西搞,5花8门,又是调vtor的,又是设置mdk的,改sct文件的,其实都没有搞对地方,浪费了很多时间,怎么调都不成,干脆自己找找吧。 ``` (tid != RT_NULL) assertion failed at function:rt_application_init, line number:200 ``` 对这个代码进行跟踪时,分配内存的时候出现问题,即rt_application_init-->rt_thread_create-->rt_object_allocate-->rt_malloc,这里出错,内存管理发现没有可用内存了,OMG,怎么可能呢,刚启动呀。 于是怀疑肯定是,heap实始化出现问题了,导致里面的内存被误认为是全部用光啦。 ``` rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END); ``` 再看一下这两是什么鬼,乖乖,就是它的问题,老的BSP中可能没有对HEAP_BEGIN进行处理,原始的值是直接写死的,乖乖,中断向量还要偏移呢,这个写死了,是不是会出问题?太高深的东西俺可不知道,反正一想,觉得这里有问题。 记得Nano版本的heap是数组搞的,后来在哪个教程中看到,它没有数组,用的是以下方式: ``` #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) #if defined(__CC_ARM) || defined(__CLANG_ARM) extern int Image$$RW_IRAM1$$ZI$$Limit; #define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) #endif #define HEAP_END STM32_SRAM1_END #endif ``` 就这段代码,搞进去,内存分配正常。 ### APP设置 带bootloader的App设置,我是直接在mdk上完成设置的,实测试,可以运行。  注意了,这里的设置,网上很多资料都说用要sct文件来搞,我也不知道为什么,刚开始也是仿着去搞的,可以执行。后来干脆MDK设置界面上完成的就得了,因为我发现,界面设置,和自己写的差不多。这里的--kepp指令是老版本中的rtt中搞过来的,实际上可以不要。  这个代码就是重点,没有这个代码,程序跑到heapinit之后,一申请内存就挂掉。  其中 ``` #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) #if defined(__CC_ARM) || defined(__CLANG_ARM) extern int Image$$RW_IRAM1$$ZI$$Limit; #define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) #endif #define HEAP_END STM32_SRAM1_END #endif ``` 这段代码很重要!!!
问
【已解决】stm32L4生成bootloader失败【搜狗浏览器的BUG】
发布于5年前
搜狗浏览器的问题,但是F1是可以生成的,很奇怪。
问
头像怎么换呀?
发布于5年前
>CTRL + F5 刷新一下,你头像已换成功了。 --- 可以了,谢谢:D
问
rt-thread printf打印信息(包含打印浮点型float)
发布于5年前
厉害了,之前我是分成两个整数打印的;P
问
头像怎么换呀?
发布于5年前
>从这里登录后 https://www.rt-thread.org/account/ 可以上传头像,然后论坛重新登录一下,头像就更新了,此 ... --- 可以上传头像啦,试一下,有没有变头像
问
RT-Thread Stduio中使用sfud+fal+easyflash
发布于5年前
>你好“复制文件【这些文件都在下载的源码包里面,手动复制出来,放到工程文件里】”在哪里下载 ... --- \RT-ThreadStudio\download\rt-thread-sdk\rt-thread-src,这里面有你的源码包,如果想自己手动下载可以到[https://www.rt-thread.org/page/download.html](https://www.rt-thread.org/page/download.html)
问
RT-Thread Stduio中使用sfud+fal+easyflash
发布于5年前
>帖子不错, 成功从0复现工程, 灰常感谢, 有几点不太一样 1 fal_flash_sfud_port.c 内容, 我不能全删, 在末尾 ... --- 不管是什么方法,功能实现了,搞出来了,它就是管用的方法。 提到的复制文件,其实可以直接手动添加到工程里实现。 为什么直接复制文件呢,我们希望当变更工程,如添加新组件等,那些文件都会被添加到工程中来。当我们不主动去写脚本的时候,就可以通过已有的目录进行操作,那些目录下都会有脚本,在生成工程时,会自动添加文件夹下的文件或是指定的文件。
问
利用按键实现某个动态线程创建和删除
发布于5年前
第3次作业,PC4为按键输入,直接在main里面扫描
问
用消息队列方式实现串口2数据接收
发布于5年前
第二次作业
问
实现独立看门狗IWDT驱动,创建喂狗线程,实现喂狗功能
发布于5年前
第一次交作业
问
[求助]我的drv_rtc.c好像是阉割版...
发布于5年前
>我也遇到同样的问题,参考论坛里面的代码增加了对ALARM的处理后就可以了,如附件 > ... --- 谢谢,我的方法和你的差不多,嘿嘿
问
RT-Thread Stduio中使用sfud+fal+easyflash
发布于5年前
>问题解决了,需要在drv_spi.c中注册下SPI驱动 --- 不好意思,好久没有上来了,是的,所有设备在使用之前都要进行注册,注册后,在使用时,就可以自动检测设备状态,完成自动初始化、打开等之类的工作了。
问
U8G2中文显示疑问
发布于5年前
>U8G2不熟悉没用过,中文这快,要保证C代码和字库的编码统一,你C文件是用UTF-8格式的话,编译器自动就按照U ... --- 恩,谢谢。U8G2的字库没有看懂,和以前我们自己做的方法不太一样,以前是以汉字作为ID,然后是点阵编码,因此,只要字库和使用文件的编码一致就可以。
«
1
2
3
4
5
»
TA的主页
TA的回答
TA的提问
TA的文章
TA的粉丝
TA的关注
会员统计
注册于 7年前
个人主页被 3650 人浏览
回到
顶部
发布
问题
投诉
建议
问 RT-Thread为什么这么这么推崇IAR和Keil等收费软件?