OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5830|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 e, F# i/ A/ ^, E7 a  m, k
' I8 v8 o$ P0 k, w! Y4 j; F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( ]! z' h- c/ w1 e$ o
#include <unistd.h>& f; f- h* t; f; u
#include <sys/mman.h>
: i+ |' x# u/ C& s9 M#include <sys/types.h>
4 [4 J  S/ h- g: U/ E$ c#include <fcntl.h>
' }- _' E3 A3 q( p+ q( `% G) M+ t2 B- |/ S) U$ q( Z+ A7 J6 m
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 @# J. [" R( x' x2 R. ?& E6 e
  Y! r& C+ L7 d( d/ x5 Etypedef struct
. D$ X& j5 g5 R% R- C6 X% X$ I{, ]: S) C' {! l7 v7 P* d$ @
        unsigned int a;3 C5 D& n4 J: k% \
        unsigned int b;! }- t$ \" j9 C- Q, M" G7 |4 X
        unsigned int packet_cout;# F% s3 m9 ]! K3 @$ Q. h2 f* U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' o- }* y1 z) Z* m9 u) J) j# f: L4 a% a$ p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' z8 E1 S; X  A% w
unsigned int count_copy = 0;9 k- p% q' n, W, N% c7 f$ H- Q8 \
# p( T5 V! B, V- R2 ]

. O4 v# D+ Z% G/ a, z. d# cint main()4 K  ?0 K8 X) x9 F6 J
{! K$ f; ^1 Z( \' g. J8 m+ V$ c$ j8 ]
        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 d% j, d6 z8 D* H/ f5 I6 q        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 H  q/ o8 o. V8 w0 l. R" r7 B2 E, h1 B0 H9 w1 [
        while(1)
: {2 J# s1 F" |2 R        {
6 }9 Q) P# o* R1 V, }7 }. j3 K- |6 ]  J                read_MSG_buffer(pshreRAM);
+ s# V0 ?3 L( B9 B1 r; W( _        }               
, p- j8 N! |9 l+ j3 m}) h) T. Z1 c; G
3 E: T! I, U: j* |0 d- p+ J/ I3 e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ {/ ?0 T. L7 ~6 s1 U{
. l6 ?) l1 A% T: s$ W+ d8 K        RX_MSG_PROTOCOL buf;( h2 ~- S, O; p% W
        ) K$ o) s8 |$ D: F
        buf.a = pshreRAM->a;/ j  r" O. c! C
        buf.b = pshreRAM->b;4 e' q% F; H) ]$ t4 N% U% \
        buf.packet_cout = pshreRAM->packet_cout;, C" t& j  q# e0 `7 N1 k. u. L* B
        
" F( i' I: Y* a        if(buf.packet_cout != count_copy)! K8 Q: U3 M+ e8 o6 o% r
        {1 r, o' `; v9 U7 l" O! a
                printf("a is %d\n", buf.a);
) Q! t  O% d" y% K) f8 R! F( e                printf("b is %d\n", buf.b);  h2 S, {8 U- P6 s7 s
                printf("count is %d\n", buf.packet_cout);7 W* t1 ~9 b/ i& e( F! X- L) G
                count_copy = buf.packet_cout;9 s$ E% }1 v3 m
        }
3 G1 J9 D) T. a; D5 R7 j        else, l7 B1 p6 o; P, w
        {( ~1 {4 G) g8 p/ q) i1 p, D
                printf("No effective message!");2 V. y% N' B. l8 H$ Y! U8 j/ V1 }
        }  w, R) k; P* a
}8 [7 D8 `- s0 ]! g3 P
6 @( U1 I# R' |

8 ?; T% N1 b* T! @' ^  d/ ^但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 m9 Q& r& L' `$ r0 n使用下面代码,对内存使用了mmap函数后:6 W- d: G) k' |" k$ F: B( o% N" z
#include <stdio.h>; o/ l; w6 k) ?; [
#include <unistd.h>
; X/ n. ^/ k4 i3 u+ d; }; w& X, V#include <sys/mman.h>* u0 O* z7 H% H$ }  y. C
#include <sys/types.h>
' ~$ Q" F' G: ~/ B7 |% G#include <fcntl.h>
/ ?  t! f+ ]; [. n, K4 C4 @& U7 d/ X
#define SHAER_RAM_BASE_ADDR    (0x80000000)
% N, C* b2 ?) k#define SHAER_RAM_SIZE         (0x20000)   * t3 z* q2 H% {. B& L4 \) N
9 B: \4 _: ^1 q5 V9 x# x5 r
typedef struct# q! F6 E) s1 k- `: ]2 ]
{
7 n, l3 Z* V. f% _        unsigned int a;) Y/ X+ z$ I% x
        unsigned int b;9 b; I" `  F( }( z7 B
        unsigned int packet_cout;4 d/ U  w' p# h) h' [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# G* k5 l7 h$ q5 ^  Z  y$ _; G) S9 j# F1 x# K. }
void read_MSG_buffer(int *baseaddr);& t5 c. c* c# I! ]2 N: _) l- _
unsigned int count_copy = 0;# x/ \0 B, d& f

$ e4 o, ^* [8 V! o7 U) wint main()9 ~9 X- p, ^- l* X: e
{' k, T$ d  n# l8 o
        int fd;
# L: u( l  {( \2 q& S$ F# x' _        int *mem = NULL;
5 S: G0 z; G' A( B; o; o% L8 ~2 p+ \% H5 M' F7 u# i
        if((fd = open("/dev/mem", O_RDWR)) <0)
# O9 l; P2 a2 w9 {4 l        {! n. R8 a' k$ I+ V
                perror("open error");
" @! ?: |# Q+ Y; z& X6 l                return -1;5 x. N( y$ R/ i1 C
        }
. Y- ^) t  k- g" Z! _2 P4 I! W        
: {& j, U% A+ h9 |1 b5 g        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ Y0 q' b6 W* `& D7 J" ]0 l! `8 y  h+ Y
        while(1)6 T% x2 j, n+ H" S+ n! z( Y
        {/ U  V* ?) g, I8 `1 K' Z5 L
                read_MSG_buffer(mem);
; J; [, k7 F8 |9 L        }                & Q) x) Q; A6 r: Q: _& Q
}
3 c) s7 j( c# _8 w' J% S' n' B
/ H$ G- N7 E. u2 t( Y4 s+ U! W. uvoid read_MSG_buffer(int *baseaddr)
! Z  [2 s; F& _& Q+ d3 [' S+ u{4 f9 j. _" k( b* ~9 [% u( u
        pRX_MSG_PROTOCOL pshreRAM = NULL;! `4 N% X, `# ]
! |) b8 s6 n! K& _, a  b" R
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" V) |$ Y- s+ c4 U
% R( j4 M# h2 p( z8 v
        if(pshreRAM->packet_cout != count_copy); ~* f' k- c% q4 R1 _( N. t! w! @
        {- A. }& v" ?( C
                printf("a is %d\n", pshreRAM->a);
' ?6 E/ N. @7 U% \' }                printf("b is %d\n", pshreRAM->b);
/ r9 j8 A" W8 L6 c+ M                printf("count is %d\n", pshreRAM->packet_cout);* n, D% G% W6 w( x
                count_copy = pshreRAM->packet_cout;
0 \. J0 f, ?4 Y7 P% M# j        }4 A- N; z& A$ l5 s! \
        else
. s4 u; T3 y+ o) q5 D0 i* u1 \        {% E7 W7 A8 J# W  g. \* B# _. ?
                printf("No effective message!\n");2 |# q; l2 X3 m5 w' y
        }! a/ B6 @( \6 n# d  d- E
}
, @+ r& C/ B/ \2 A/ D- H8 W' u9 d) J+ A2 X0 t. m5 F1 ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, d: M8 G8 g  b" a2 S6 y; t% ]. O

- j! B. L% q/ i7 T( o! q$ K% Z) J5 i+ g2 m% c9 L8 ^
2 o1 n* g6 R+ B' \

# Z$ s9 i0 t, |8 M! n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-3-2 21:48 , Processed in 0.040937 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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