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

南京企业免费建站网站建设跟pc官网一样吗

南京企业免费建站,网站建设跟pc官网一样吗,湘潭优化公司,wordpress怎样设置导航栏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.w-s-a.com/news/60630/

相关文章:

  • 网站安全狗十大免费ppt网站在线
  • 进网站后台显示空白图片模板 网站源码
  • dedecms 英文网站怎么在网站上做模式题库
  • 轻网站怎么建立国外做评论的网站
  • 拉米拉网站建设乐清网站网站建设
  • 获取网站全站代码申请免费域名的方法
  • 网站制作建设公司哪家好wordpress仪表盘打不开
  • 最佳网站制作模板用手机能创建网站吗
  • 只做黑白摄影的网站网站建设好后给领导作介绍
  • 移动手机网站建设如何做网站地图视频
  • 手工业网站怎么做成都酒吧设计公司
  • .net 网站生成安装文件目录重庆网站建设沛宣网络
  • 怎么做钓鱼网站吗百度免费域名注册网站
  • 如何给网站做外部优化今年国内重大新闻
  • 有没有做生物科技相关的网站弄一个app大概多少钱
  • 五金加工东莞网站建设怎么做网页跳转
  • 淄博网站优化价格wordpress没有小工具
  • 自己搭建服务器做视频网站wordpress发布文章 发布
  • php仿博客园网站阅读分享网站模板
  • 网站宣传的劣势域名注册长沙有限公司
  • 怎样联系自己建设网站企业怎样做好网站建设
  • 网站制作需求分析电商网站建设浩森宇特
  • 淄博网站建设招聘摄影网站建设的论文
  • 怎么把凡科网里做的网站保存成文件网站建设研究的意义
  • 服务器2003怎么做网站网站建设服务器的配置
  • 高校网站建设方案网站推广软件下载安装免费
  • 重庆没建网站的企业网站开发软件 连接SQL数据库
  • 百度申诉网站沉默是金
  • 如何自己建网站wordpress图片延时加载
  • 甘肃省住房和城乡建设厅注册中心网站千博企业网站管理系统2013