搜索
bottom↓
回复: 10

C# 调用JLINKARM.dll 的JLINKARM_TIF_Select函数提示托管签名不匹配

[复制链接]

出0入8汤圆

发表于 2019-9-20 09:15:17 | 显示全部楼层 |阅读模式
JLINKARM_TIF_Select  申明如下:

[DllImport(@"E:\vs\JLinkARM.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern void JLINKARM_TIF_Select(int i);


调用:

   JLINKARM_TIF_Select(1);


查了下,一般说法是参数的类型不对,然后换 uint 、byte等尝试,还是报错


这个函数在c++中掉过,参数类型没怎么特别留意,直接就可以用的,  好像没有 C#中这种要求。


搞过的给点意见 谢谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入8汤圆

 楼主| 发表于 2019-9-20 09:19:24 | 显示全部楼层
补充出错信息:    其他信息: 对 PInvoke 函数“vl.Form1::JLINKARM_TIF_Select”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

出0入0汤圆

发表于 2019-9-20 13:46:47 | 显示全部楼层
extern static public int JLINKARM_TIF_Select(int tif);
有返回值

出0入0汤圆

发表于 2019-9-20 14:50:45 | 显示全部楼层
楼上两位,能否共享一下 JLinkARM.dll 操作方法, 能在vc++,或者qt使用

出0入8汤圆

 楼主| 发表于 2019-9-20 15:50:24 | 显示全部楼层
382570793 发表于 2019-9-20 13:46
extern static public int JLINKARM_TIF_Select(int tif);
有返回值


public static extern int JLINKARM_TIF_Select(int i);

试了下还是不行, 总是提示调用导致堆栈不对称。

出0入8汤圆

 楼主| 发表于 2019-9-20 16:02:28 | 显示全部楼层
xiaomu 发表于 2019-9-20 14:50
楼上两位,能否共享一下 JLinkARM.dll 操作方法, 能在vc++,或者qt使用

h文件

#ifndef _JK_H__
#define _JK_H__


//读取指定内存的值
typedef void(*pFunc_ReadMem)(unsigned int addr, unsigned int size, unsigned char *buf);
//想指定内存地址写入固定值
typedef void(*pFunc_WriteMem)(unsigned int addr, unsigned int size, const void *buf);
//选择芯片类型函数
typedef unsigned int(*pFunc_ExecCommand)(char *device, unsigned char *pbuf, unsigned int size);
//设置通信速度
typedef void(*pFunc_SetSpeed)(unsigned short speed);
//读取通信速度
typedef unsigned short(*pFunc_GetSpeed)(void);
//获取ID号
typedef unsigned int(*pFunc_GetId)(void);

typedef void(*pFunc_TIF_Select)(unsigned int i);

typedef unsigned int(*pFunc_IsConnected)(void);

//write reg
typedef void(*pFunc_WriteReg)(unsigned int index, unsigned int data);
//read reg
typedef unsigned int(*pFunc_ReadReg)(unsigned int index);

//read mem u32
typedef void(*pFunc_ReadMemU32)(unsigned int addr, unsigned int size, unsigned int *data, unsigned char *status);
//read mem u16
typedef void(*pFunc_ReadMemU16)(unsigned int addr, unsigned int size, unsigned short *data, unsigned char *status);
//read mem u8
typedef void(*pFunc_ReadMemU8)(unsigned int addr, unsigned int size, unsigned char *data, unsigned char *status);


//write u32
typedef void(*pFunc_WriteU32)(unsigned int addr, unsigned int data);
//read u32
typedef unsigned int(*pFunc_ReadU32)(unsigned int addr);

//write u16
typedef void(*pFunc_WriteU16)(unsigned int addr, unsigned short data);
//read u16
typedef unsigned short(*pFunc_ReadU16)(unsigned int addr);

//write u8
typedef void(*pFunc_WriteU8)(unsigned int addr, unsigned char data);
//read u8
typedef unsigned char(*pFunc_ReadU8)(unsigned int addr);

typedef struct
{
    pFunc_ReadMem JLINKARM_ReadMem;
    pFunc_WriteMem JLINKARM_WriteMem;

    pFunc_WriteReg JLINKARM_WriteReg;
    pFunc_ReadReg JLINKARM_ReadReg;

    pFunc_ReadMemU32 JLINKARM_ReadMemU32;
    pFunc_ReadMemU16 JLINKARM_ReadMemU16;
    pFunc_ReadMemU8 JLINKARM_ReadMemU8;

    pFunc_WriteU32 JLINKARM_WriteU32;
    pFunc_ReadU32 JLINKARM_ReadU32;

    pFunc_WriteU16 JLINKARM_WriteU16;
    pFunc_ReadU16 JLINKARM_ReadU16;

    pFunc_WriteU8 JLINKARM_WriteU8;
    pFunc_ReadU8 JLINKARM_ReadU8;


    pFunc_GetId JLINKARM_GetId;
    pFunc_ExecCommand JLINKARM_ExecCommand;
    pFunc_GetSpeed JLINKARM_GetSpeed;
    pFunc_SetSpeed JLINKARM_SetSpeed;
    pFunc_TIF_Select JLINKARM_TIF_Select;
    pFunc_IsConnected  JLINKARM_IsConnected;
}dsJlink;

extern dsJlink jlink;

unsigned int InitJLink(void);



#endif


c文件
#include "stdafx.h"
#include "windows.h"
//#include <iostream>
#include "jlink.h"

#pragma  comment(lib, "JLinkARM.dll")

dsJlink jlink;

unsigned char JLINKARM_ReadU8(unsigned int addr)
{
    unsigned char ret;
    unsigned char st;

    jlink.JLINKARM_ReadMemU8(addr, 1, &ret, &st);
    return ret;
}

unsigned short JLINKARM_ReadU16(unsigned int addr)
{
    unsigned short ret;
    unsigned char st;

    jlink.JLINKARM_ReadMemU16(addr, 1, &ret, &st);

    return ret;
}

unsigned int JLINKARM_ReadU32(unsigned int addr)
{
    unsigned int ret;
    unsigned char st;

    jlink.JLINKARM_ReadMemU32(addr, 1, &ret, &st);

    return ret;
}

unsigned int InitJLink(void)
{
    #define BUF_MAX_SIZE                  600
    unsigned char buf[BUF_MAX_SIZE];

    //加载动态库
    HMODULE hMod = LoadLibrary("JLinkARM.dll");

    ///根据函数名获取函数指针
    jlink.JLINKARM_TIF_Select = (pFunc_TIF_Select)GetProcAddress(hMod, TEXT("JLINKARM_TIF_Select"));
    jlink.JLINKARM_ExecCommand = (pFunc_ExecCommand)GetProcAddress(hMod, TEXT("JLINKARM_ExecCommand"));
    jlink.JLINKARM_GetId = (pFunc_GetId)GetProcAddress(hMod, TEXT("JLINKARM_GetId"));
    jlink.JLINKARM_IsConnected = (pFunc_IsConnected)GetProcAddress(hMod, TEXT("JLINKARM_IsConnected"));

    jlink.JLINKARM_ReadMem = (pFunc_ReadMem)GetProcAddress(hMod, TEXT("JLINKARM_ReadMem"));
    jlink.JLINKARM_WriteMem = (pFunc_WriteMem)GetProcAddress(hMod, TEXT("JLINKARM_WriteMem"));
   
    jlink.JLINKARM_SetSpeed = (pFunc_SetSpeed)GetProcAddress(hMod, TEXT("JLINKARM_SetSpeed"));
    jlink.JLINKARM_GetSpeed = (pFunc_GetSpeed)GetProcAddress(hMod, TEXT("JLINKARM_GetSpeed"));

    jlink.JLINKARM_ReadMemU32 = (pFunc_ReadMemU32)GetProcAddress(hMod, TEXT("JLINKARM_ReadMemU32"));
    jlink.JLINKARM_ReadMemU16 = (pFunc_ReadMemU16)GetProcAddress(hMod, TEXT("JLINKARM_ReadMemU16"));
    jlink.JLINKARM_ReadMemU8 = (pFunc_ReadMemU8)GetProcAddress(hMod, TEXT("JLINKARM_ReadMemU8"));



    jlink.JLINKARM_WriteU32 = (pFunc_WriteU32)GetProcAddress(hMod, TEXT("JLINKARM_WriteU32"));
    jlink.JLINKARM_ReadU32 = (pFunc_ReadU32)GetProcAddress(hMod, TEXT("JLINKARM_ReadU32"));

    jlink.JLINKARM_WriteU16 = (pFunc_WriteU16)GetProcAddress(hMod, TEXT("JLINKARM_WriteU16"));
    jlink.JLINKARM_ReadU16 = (pFunc_ReadU16)GetProcAddress(hMod, TEXT("JLINKARM_ReadU16"));

    jlink.JLINKARM_WriteU8 = (pFunc_WriteU8)GetProcAddress(hMod, TEXT("JLINKARM_WriteU8"));
    jlink.JLINKARM_ReadU8 = (pFunc_ReadU8)GetProcAddress(hMod, TEXT("JLINKARM_ReadU8"));

    jlink.JLINKARM_WriteReg = (pFunc_WriteReg)GetProcAddress(hMod, TEXT("JLINK_WriteReg"));
    jlink.JLINKARM_ReadReg = (pFunc_ReadReg)GetProcAddress(hMod, TEXT("JLINK_ReadReg"));

    //以下三个函数上面没有一次封装,这里进行二次封装一下
    jlink.JLINKARM_ReadU32 = JLINKARM_ReadU32;
    jlink.JLINKARM_ReadU16 = JLINKARM_ReadU16;
    jlink.JLINKARM_ReadU8 = JLINKARM_ReadU8;


    //选择设备
    if (jlink.JLINKARM_TIF_Select != NULL)
    {
        jlink.JLINKARM_TIF_Select(1);
    }
    //设置芯片型号
    if (jlink.JLINKARM_ExecCommand != NULL)
    {
        unsigned int ret = 0;
        //选择芯片类型
        ret = jlink.JLINKARM_ExecCommand("Device = Cortex-M3", buf, 64);
    }
    //判断jlink是否连接上
    if (jlink.JLINKARM_IsConnected != NULL)
    {
        unsigned int ret = 0;
        ret = jlink.JLINKARM_IsConnected();
        printf("isConnected is %d\r\n", ret);
    }
    //设置jlink速度
    if (jlink.JLINKARM_SetSpeed != NULL)
    {
        jlink.JLINKARM_SetSpeed(12000);
        printf("set jlink speed ok\r\n");
    }
    //获取jlink速度
    if (jlink.JLINKARM_GetSpeed != NULL)
    {
        unsigned int speed = jlink.JLINKARM_GetSpeed();
        printf("get speed is %d khz\r\n", speed);
    }

    if (jlink.JLINKARM_WriteMem != NULL)
    {
        printf("jlink write mem func not null!\r\n");
    }


    return 0;
}


这是以前写得玩的 , 希望对你有用

出0入0汤圆

发表于 2019-9-20 16:06:59 | 显示全部楼层

感谢,!!

出0入25汤圆

发表于 2019-9-20 17:30:11 | 显示全部楼层
添加CallingConvention属性 试试,把
CallingConvention = CallingConvention.StdCall
CallingConvention = CallingConvention.Cdecl
CallingConvention = CallingConvention.FastCall
CallingConvention = CallingConvention.ThisCall
CallingConvention = CallingConvention.Winapi
都试一下吧,有次调用can 的dll 就是这么试出来的。。。

出0入8汤圆

 楼主| 发表于 2019-9-23 09:05:20 | 显示全部楼层
墨非 发表于 2019-9-20 17:30
添加CallingConvention属性 试试,把
CallingConvention = CallingConvention.StdCall
CallingConvention = ...

CallingConvention = CallingConvention.Cdecl

加这个有效,多谢

出0入0汤圆

发表于 2019-12-4 14:50:18 | 显示全部楼层
不错,但是官方要几百英镑才提供j-link sdk

出0入0汤圆

发表于 2020-6-30 22:49:15 | 显示全部楼层
楼主   放一个工程出来呗
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 01:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表