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

坊子网站建设服务好的企业网站怎么建设

坊子网站建设,服务好的企业网站怎么建设,龙岩艺尚网络科技有限公司,互联网营销网站建设rt-thread 移植调试记录 记录rt-thread移植的过程。这里移植仅仅是利用rt-thread源码目录已经移植好的文件#xff0c;组建自己的工程#xff0c;不需要自己编写汇编完成底层移植。 1. 搭建基础工程 这里使用的是正点原子的潘多拉开发板#xff0c;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.c和cpu.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.c和board.h添加到工程中。将该函数的实现也按照board.c中的样子重写一下。 将main.c中的初始化都放到这个函数中来另外还需要实现SysTick_Handler函数为rtt提供系统时间。board.c #include board.h #include rtthread.h #include usart.h #include gpio.hvoid 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 sectionCSTACK #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://www.hkea.cn/news/14264270/

相关文章:

  • 做网站主要是做什么wordpress easydigital
  • 建设公司网站需要准备哪些材料网站排名优化如何做
  • 国外网站怎样建设如何制作一个简单的网页链接
  • 小白学做网站买什么书成都最差的十大物业公司
  • 马鞍山网站建设cnfg织梦登录wordpress
  • 沈阳网站设计营销型杭州排名优化公司电话
  • wordpress著名网站最新新闻热点事件摘抄300字
  • 免费网站模板 下载网站后台文章编辑不了
  • 女生做网站前端设计师智能营销方法
  • 武夷山住房和城乡建设部网站如何保护自己的网站
  • 360建筑网官方网站北丰科技网站建设
  • 机械行业网站怎么做工信部怎么查网站备案
  • 已有域名 做网站重庆建设造价信息网官网
  • 网络营销推广的案例株洲seo优化高手
  • 网站广告布局国外产品展示网站模板
  • 网站建设 工商注册不重名的建筑公司名字
  • 十堰市公司网站建设东莞市城乡建设规划局官网
  • 江苏通力建设官方网站宣传册制作软件app
  • 公司网站制作找哪家设计素材网站照片
  • 如何快速建设网站电商平台技术开发方案
  • 技术支持 东莞网站建设石材做展示网站步骤
  • 广州天河建网站网站建设找单
  • 网站内容与功能模块设计简约风网站首页怎么做
  • 主流网站 技术建网站团队
  • 南宁网站建设速成培训网站二次开发模板
  • 环保公司网站架构怎么做wordpress文章404错误
  • 网站图片被盗连怎么办做结构设计有没有自学的网站
  • 以营销型网站为主要营销方式的案例电脑网站打不开是什么原因造成的
  • 上海网站推广定制免费的大数据分析平台
  • 长沙微网站建设公司一级造价工程师准考证打印时间