当前位置: 首页 > news >正文

西安建设公司网站google搜索引擎入口2022

西安建设公司网站,google搜索引擎入口2022,微站电池,北京移动端网站建设rt-thread 移植调试记录 记录rt-thread移植的过程。这里移植仅仅是利用rt-thread源码目录已经移植好的文件,组建自己的工程,不需要自己编写汇编完成底层移植。 1. 搭建基础工程 这里使用的是正点原子的潘多拉开发板,MCU为stm32l475。需要先…

rt-thread 移植调试记录

记录rt-thread移植的过程。这里移植仅仅是利用rt-thread源码目录已经移植好的文件,组建自己的工程,不需要自己编写汇编完成底层移植。

1. 搭建基础工程

这里使用的是正点原子的潘多拉开发板,MCU为stm32l475。需要先通过CubeMX搭建基础工程。

选择从芯片创建工程。

1.1 CubeMX创建工程

开启RCC:

在这里插入图片描述

开启串口:

在这里插入图片描述

开启LED对应的GPIO:

在这里插入图片描述

配置时钟,stml475主频为80M:

最后生成MDK工程。

1.2 工程配置

1.2.1 KEIL工程配置

使用KEIL打开MDK工程。

配置microlib:

在这里插入图片描述

配置Debug下载程序重启芯片:

在这里插入图片描述

1.2.2 添加串口打印

#include <stdio.h>
int fputc(int ch, FILE *f)
{uint8_t c = ch;HAL_UART_Transmit(&huart1, &c, 1, 5000);return (ch);
}

1.2.3 点亮LED

int main()
{......while (1){HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET);printf("test\r\n");HAL_Delay(1000);} 
}

1.2.4 编译下载

编译下载程序。可以看到开发板的LED灯变红。串口输出“test”字符串。

2. 移植rt-thread

完成基础工程创建后,接下来就是移植工作了。

先将rt-thread源码目录下的srcinclude, libcpu 目录复制一分到MDK工程中,移植时,直接添加需要的文件即可。

2.1 添加平台相关文件

参考RT-Thread Studio IDE的工程,就能够发现,主要的移植工作就在libcpu目录中,主要为context_gcc.S。根据我们使用的芯片架构,进行移植。由于rt-thread源码目录提供了各个平台的已经移植完成的文件,我们只需要根据芯片架构进行添加即可。

在这里插入图片描述

主要是开关中断,线程切换,PendSV相关的函数的移植。这部分内容需要会汇编才能做。因此直接使用现成已经移植好的直接使用即可。 比如上述stm32l475芯片,架构是Contex-M4。可以直接在rt-thread源码目录下libcpu\arm\cortex-m4找到对应的文件:

在这里插入图片描述

这里,context_gcc.S用于RT-Thread Studio IDE工具链使用的,context_rvds.S 用于MDK的工具链使用,另外一个看名字就知道是IAR使用的了。

除了上述文件,还需要将cpuport.c也添加到工程中。另外还有上层目录的common目录下,也有部分移植文件,这部分内容暂时可不添加。

2.2 添加内核相关文件

将src目录的所有文件添加到工程中。

2.3 添加头文件路径

2.4 添加rtconfig.h

找到一份基础的rtconfig.h文件,添加到工程中。我这里的基础文件是通过RT-Thread Studio创建的基础工程,直接复制使用的。

添加完成后,KEIL工程结构如下:

整体工程结构如下:

在这里插入图片描述

2.5 编译

完成上述添加,基本上就是添加了我们需要的纯rtt内核了,没有使用到rtt的组件。直接编译会报很多错误,因此针对上面的工程还需要做一些修改。

先直接编译看看错误:

在这里插入图片描述

主要看到的就是va_list未定义的错误。这个错误是因为缺少头文件,我们在rtconfig.h中添加头文件即可:

#include <stdarg.h>

接着编译,依然报错:

在这里插入图片描述

没有找到finsh.h头文件,由于我们rtconfig.h中启用了finsh组件,但是没有添加这个组件相关的文件导致的报错,在rtconfig.h文件中取消使用finsh即可,注释掉相关宏定义:

/* Command shell *///#define RT_USING_FINSH
//#define FINSH_THREAD_NAME "tshell"
//#define FINSH_USING_HISTORY
//#define FINSH_HISTORY_LINES 5
//#define FINSH_USING_SYMTAB
//#define FINSH_USING_DESCRIPTION
//#define FINSH_THREAD_PRIORITY 20
//#define FINSH_THREAD_STACK_SIZE 4096
//#define FINSH_CMD_SIZE 80
//#define FINSH_USING_MSH
//#define FINSH_USING_MSH_DEFAULT
//#define FINSH_USING_MSH_ONLY
//#define FINSH_ARG_MAX 10
/* end of Command shell */

接着编译,报错:

在这里插入图片描述

这是两个奇怪的问题,特别是下面这个,找半天也不知道哪儿出错了。最后对比RT-Thread Studio生成的基础工程,发现工程中并没有导入driver.ccpu.c这两个文件。看这个cpu.c应该是多核MCU使用的,因此在KEIL工程中删除这两个文件。

再编译,报错:

这是因为生成MDK工程,需要我们在stm32l4xx_it.c移植这两个函数,但是我们已经在context_rvds.S中移植了这两个中断函数,因此出现了重定义的错误。可以直接注释掉stm32l4xx_it.c中重定义的函数,或者将其生命为弱符号:

__attribute__((weak)) void HardFault_Handler(void)
{/* USER CODE BEGIN HardFault_IRQn 0 *//* USER CODE END HardFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_HardFault_IRQn 0 *//* USER CODE END W1_HardFault_IRQn 0 */}
}__attribute__((weak)) void PendSV_Handler(void)
{/* USER CODE BEGIN PendSV_IRQn 0 *//* USER CODE END PendSV_IRQn 0 *//* USER CODE BEGIN PendSV_IRQn 1 *//* USER CODE END PendSV_IRQn 1 */
}

在编译,还是报错:

在这里插入图片描述

函数rt_hw_board_init未定义,这里也可以抄一抄,在RT-Thread Studio中生成的board.c中的定义,创建board.cboard.h,添加到工程中。将该函数的实现也按照board.c中的样子重写一下。

main.c中的初始化都放到这个函数中来,另外还需要实现SysTick_Handler函数,为rtt提供系统时间。board.c

#include "board.h"
#include "rtthread.h"
#include "usart.h"
#include "gpio.h"void SystemClock_Config(void);void rt_hw_board_init()
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / RT_TICK_PER_SECOND);HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}void SysTick_Handler(void)
{rt_interrupt_enter();HAL_IncTick();rt_tick_increase();rt_interrupt_leave();
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Configure the main internal regulator output voltage*/if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK){Error_Handler();}/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 1;RCC_OscInitStruct.PLL.PLLN = 20;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 */

board.h

#ifndef __BOARD_H
#define __BOARD_H#include <stm32l4xx.h>#define STM32_FLASH_START_ADRESS       ((uint32_t)0x08000000)
#define STM32_FLASH_SIZE               (512 * 1024)
#define STM32_FLASH_END_ADDRESS        ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE))#define STM32_SRAM1_SIZE               (96)
#define STM32_SRAM1_START              (0x20000000)
#define STM32_SRAM1_END                (STM32_SRAM1_START + STM32_SRAM1_SIZE * 1024)#if defined(__ARMCC_VERSION)
extern int Image$$RW_IRAM1$$ZI$$Limit;
#define HEAP_BEGIN      ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
#elif __ICCARM__
#pragma section="CSTACK"
#define HEAP_BEGIN      (__segment_end("CSTACK"))
#else
extern int __bss_end;
#define HEAP_BEGIN      ((void *)&__bss_end)
#endif#define HEAP_END                       STM32_SRAM1_ENDvoid rt_hw_board_init(void);#endif

最后再编译,完成,没有报错了。

在这里插入图片描述

2.6 调试

下载程序,发现终端没有输出,LED也没有变化。使用KEIL的Debug功能,找到出错的地方。

在这里插入图片描述

回退一点,会发现,程序死在了主线程创建的位置:

    thread = (struct rt_thread *)rt_object_allocate(RT_Object_Class_Thread,name);if (thread == RT_NULL)return RT_NULL;

跟踪发现,是由于内存分配失败导致的,需要分配内存的指针始终指向NULL:

#define _MEM_MALLOC(...)     RT_NULLrt_weak void *rt_malloc(rt_size_t size)
{rt_base_t level;void *ptr;/* Enter critical zone */level = _heap_lock();/* allocate memory block from system heap */ptr = _MEM_MALLOC(size);/* Exit critical zone */_heap_unlock(level);/* call 'rt_malloc' hook */RT_OBJECT_HOOK_CALL(rt_malloc_hook, (ptr, size));return ptr;
}

查看kservice.c文件,实际可以通过rtconfig.h中的宏定义来控制内存分配的实现方式,这里指定RT_USING_SMALL_MEM_AS_HEAP 作为内存分配方式,将这个宏添加到rtconfig.h中宏定义。

/* Memory Management */
#define RT_USING_MEMPOOL
#define RT_USING_SMALL_MEM
#define RT_USING_HEAP
#define RT_USING_SMALL_MEM_AS_HEAP
/* end of Memory Management */

再次编译,没有报错,稍留程序,LED灯点亮,串口输出正常,输出字符串“test”。

移植控制台输出,在board.c中添加:

void rt_hw_console_output(const char *str)
{RT_ASSERT(str != RT_NULL);char ch;while (*str != '\0'){if (*str == '\n') {ch = '\r';HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 5000);}HAL_UART_Transmit(&huart1, (uint8_t *)str++, 1, 5000);}
}

完成:

在这里插入图片描述

最后再在主线程中创建一个线程,进行测试:

#define THREAD_PRIORITY  25
#define THREAD_STACK_SIZE 512
#define THREAD_TIMESLICE   5void led_thread_entry(void *parameter)
{while (1){rt_kprintf("enter test thread\n");rt_thread_delay(RT_TICK_PER_SECOND);}
}    int main() 
{rt_thread_t tid;tid = rt_thread_create("led", led_thread_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);if (tid != RT_NULL){rt_thread_startup(tid);} else {rt_kprintf("create thread error\n");}while (1){HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET);rt_kprintf("test\r\n");rt_thread_delay(1000);}
}

这里注意将API都修改为rtt的,否则打印只会出现testenter test thread 不会出现:

在这里插入图片描述


文章转载自:
http://apotropaic.qkqn.cn
http://sigla.qkqn.cn
http://esplees.qkqn.cn
http://shick.qkqn.cn
http://understatement.qkqn.cn
http://undrape.qkqn.cn
http://stylus.qkqn.cn
http://streakily.qkqn.cn
http://expressionistic.qkqn.cn
http://parapet.qkqn.cn
http://fascicled.qkqn.cn
http://inflated.qkqn.cn
http://arthrosis.qkqn.cn
http://ahitophal.qkqn.cn
http://affiant.qkqn.cn
http://hilum.qkqn.cn
http://isodiaphere.qkqn.cn
http://buildable.qkqn.cn
http://insymbol.qkqn.cn
http://shellshocked.qkqn.cn
http://pullus.qkqn.cn
http://affiant.qkqn.cn
http://ligneous.qkqn.cn
http://sackless.qkqn.cn
http://dimm.qkqn.cn
http://scoriform.qkqn.cn
http://troubled.qkqn.cn
http://watchfulness.qkqn.cn
http://cobby.qkqn.cn
http://veiling.qkqn.cn
http://paternalistic.qkqn.cn
http://unquenchable.qkqn.cn
http://msn.qkqn.cn
http://nejd.qkqn.cn
http://rapidness.qkqn.cn
http://seething.qkqn.cn
http://meridian.qkqn.cn
http://cleaner.qkqn.cn
http://cuvette.qkqn.cn
http://thorax.qkqn.cn
http://directivity.qkqn.cn
http://percussion.qkqn.cn
http://californiana.qkqn.cn
http://extrema.qkqn.cn
http://thingummy.qkqn.cn
http://compunication.qkqn.cn
http://autarkical.qkqn.cn
http://aha.qkqn.cn
http://vieta.qkqn.cn
http://somnific.qkqn.cn
http://cobnut.qkqn.cn
http://consent.qkqn.cn
http://pyrrhotine.qkqn.cn
http://pediculus.qkqn.cn
http://vug.qkqn.cn
http://nourishing.qkqn.cn
http://lightwave.qkqn.cn
http://anemometry.qkqn.cn
http://disfiguration.qkqn.cn
http://toes.qkqn.cn
http://harlotry.qkqn.cn
http://biocenosis.qkqn.cn
http://fare.qkqn.cn
http://deanship.qkqn.cn
http://vanward.qkqn.cn
http://innateness.qkqn.cn
http://decane.qkqn.cn
http://calyces.qkqn.cn
http://ultimacy.qkqn.cn
http://shamelessly.qkqn.cn
http://milwaukee.qkqn.cn
http://georgic.qkqn.cn
http://pregalactic.qkqn.cn
http://marsupial.qkqn.cn
http://kauri.qkqn.cn
http://microcosmos.qkqn.cn
http://binary.qkqn.cn
http://honeyed.qkqn.cn
http://postirradiation.qkqn.cn
http://ichnite.qkqn.cn
http://educational.qkqn.cn
http://woofter.qkqn.cn
http://bourbonism.qkqn.cn
http://topdisc.qkqn.cn
http://malty.qkqn.cn
http://occidental.qkqn.cn
http://overdid.qkqn.cn
http://silencer.qkqn.cn
http://thyroid.qkqn.cn
http://redskin.qkqn.cn
http://counterorder.qkqn.cn
http://mescalero.qkqn.cn
http://shote.qkqn.cn
http://calculational.qkqn.cn
http://pipul.qkqn.cn
http://saucy.qkqn.cn
http://judaeophobe.qkqn.cn
http://gally.qkqn.cn
http://haemagogue.qkqn.cn
http://decided.qkqn.cn
http://www.dt0577.cn/news/68275.html

相关文章:

  • 建站平台wp百度一下你知道主页官网
  • 俱乐部网站方案19
  • 定制制作网站开发云南疫情最新消息
  • 家具网站建设策划seo排名优化软件有
  • wordpress初音主题南京百度快速排名优化
  • wordpress 安装 数据库市场推广seo职位描述
  • 有经验的赣州网站建设百度推广代运营公司
  • 网站建设策划方案google seo教程
  • 没有做等保的网站不能上线对吗网店代运营诈骗
  • 网络营销整合营销seo服务外包客服
  • 网站做超链接薪资多少一个月高级seo
  • 台州网站建设公司.今日热点新闻素材
  • 免费一键建站官网大全网站seo策划方案实例
  • app那个网站开发比较好好的搜索引擎推荐
  • 网站建设 视频百度推广客户端app
  • wordpress 移动端编辑器网络优化工程师是做什么的
  • 做城通网盘资源网站的源码站长素材网
  • 网站做动态图片今日重大新闻头条
  • 杰奇网站地图怎么做收录批量查询工具
  • qq网页版直接登录手机版网站关键词排名优化
  • 注册100万公司需要多少钱南昌seo全网营销
  • wordpress移动应用优化设计六年级下册语文答案
  • asp网站后台管理系统密码破解seo优化培训课程
  • wordpress seo by yoast插件下载深圳优化公司高粱seo较
  • 可以免费做演播的听书网站武汉搜索排名提升
  • 美丽深圳微信公众号二维码河南网站建设优化技术
  • 域名注册 网站建设 好做吗短视频营销成功的案例
  • 网站制作替我们购买域名企业营销策划方案范文
  • 黑龙江省城乡和建设厅网站首页直通车关键词优化
  • 无锡网站建设唯唯网络百度地图官网2022最新版下载