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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- D4 E5 {8 P1 Q7 }2 p9 C# e1 P( @' J( n' W
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 u4 s8 H5 _9 W" |$ M
#include <unistd.h>
  I5 V" f9 Q6 y4 |7 F) \- c* v#include <sys/mman.h>
* H; E6 Q6 X0 l% Q5 E0 l#include <sys/types.h>$ x) z8 X& B0 n7 W4 O8 y
#include <fcntl.h>4 P6 O. v; p6 R1 L2 q) s
/ A/ a' H9 Q& W' s8 T
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ( Q: k6 K  G. f

- n; d& H( ~, stypedef struct) @8 |1 W' ?4 Y/ M
{8 Y! s! K3 U6 C6 `4 O2 l
        unsigned int a;
0 @+ ?. Y4 V. F) A        unsigned int b;/ N# i5 z+ O8 p! a7 n7 J, B
        unsigned int packet_cout;
' h. j" H' d. U# w/ s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: e+ ?5 O8 g$ y# S- ]7 ?# z- i+ J( R# H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- T3 Y8 K1 ~# @7 e0 Munsigned int count_copy = 0;
$ g" ^. u+ b% U+ N0 y8 p& T$ t' ]
2 ^' d5 @- [9 ^9 |( d* j( S
3 E3 b0 d7 Z! E2 ]% b" Lint main()
3 A2 V" l* N$ E{% o% L3 t# S: O+ r/ ~: K
        pRX_MSG_PROTOCOL pshreRAM = NULL;* _0 f. r  Y0 _
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, o% m; _. p" j# N+ z4 B
8 _1 T" X, @3 R( Z+ m        while(1)9 \5 P2 n& k+ B" P  S* T
        {0 H# w% Q* x: s4 A* ]# {# y
                read_MSG_buffer(pshreRAM);- B, V: g$ N  p* U0 T! B& j
        }                - M! s1 F- J- M" s
}9 f- H- @5 d4 Q! q+ O) q
- R0 q! q+ R3 J. _, y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% d; G; ^9 c) f# n7 |$ ^- L
{( Q3 E' P( W' S2 s& u  M$ u7 s
        RX_MSG_PROTOCOL buf;7 Y# o2 Z" b9 N" C0 \4 U  I
        * j$ M) a9 U- G+ n  b9 l2 r
        buf.a = pshreRAM->a;
2 a  H  Q( S3 P  ~        buf.b = pshreRAM->b;  Q2 L1 j- y& w- @5 j3 }+ @6 Q5 d
        buf.packet_cout = pshreRAM->packet_cout;$ D$ _: |8 i. a. [: S- a1 C
        
9 Z8 a3 d2 M4 O$ K        if(buf.packet_cout != count_copy)
" a/ s8 j% y! M        {* K  U# }) O/ f
                printf("a is %d\n", buf.a);
+ ~( P: z0 |0 H4 J% P. w6 d, M                printf("b is %d\n", buf.b);
: F4 R- U: M! t                printf("count is %d\n", buf.packet_cout);4 G2 o) n# y( d4 q0 D" B
                count_copy = buf.packet_cout;0 I% T, X% |: f" o' _' o" R
        }( p6 R8 I. T' z, G4 X
        else/ |2 h5 s4 M# _+ v1 F" p; n' J$ v
        {
  ~' w  u" ?* k$ S, s1 ]0 r* X5 X                printf("No effective message!");
# n# b4 J! |( _4 ^        }
& e5 A# z4 v9 L. d( `# ]}+ f5 _# h$ W$ g2 ]* H" ?
/ |, `1 ]9 k/ V0 `

6 S" x6 w! w) R但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ U0 h8 i( _/ o5 ]; l: n$ i
使用下面代码,对内存使用了mmap函数后:
* A% z' n0 Q. o* q) G/ w6 W! E#include <stdio.h>7 c1 j4 l6 c1 \& t! |( C8 s
#include <unistd.h>
; K8 n$ ^6 T/ e+ Y( X0 x/ f#include <sys/mman.h>
" E7 d1 t/ X3 T; Y& t! J#include <sys/types.h>4 u' F( p2 R: ]' E
#include <fcntl.h>8 P) ^) ?: f" C3 \  t7 ]

9 L" T8 \2 E" z#define SHAER_RAM_BASE_ADDR    (0x80000000)+ N7 }9 `  Q( i+ w. ]
#define SHAER_RAM_SIZE         (0x20000)   
) R  j2 C/ J& F8 w! J/ ^! w
4 a1 z3 H% S* c: g" O) f! u+ Wtypedef struct
' `+ w# ^, |. D2 o4 M. {6 U{3 _0 f: Y1 R  V8 _$ n( B) h
        unsigned int a;
/ r! V+ ^# P) P2 L+ @8 P        unsigned int b;+ y1 ~8 g6 h+ `
        unsigned int packet_cout;5 k2 F1 o  u- O" Y. I) _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ B* Q0 ^/ v# e( z/ X2 S; P3 S  {( ~- \8 s! J, s2 _; l
void read_MSG_buffer(int *baseaddr);
6 |/ C6 U" ^: S! s* v* E9 Ounsigned int count_copy = 0;/ g3 m/ H2 i2 e8 I. Z4 o$ z
! R6 U/ _' D0 B
int main(): \+ h* z7 Y( K" k! y3 |3 [/ p
{
1 ?. s/ s  D/ j, l7 r        int fd;
+ j. f% f. @- i# w3 ^        int *mem = NULL;
) I4 `, B/ M0 S, B$ A
: h" S( @! }6 V. f        if((fd = open("/dev/mem", O_RDWR)) <0)4 H9 a, H% B% \4 C9 |2 e  r- x
        {
) V* a: U2 K/ D+ C                perror("open error");
+ u. B  S0 @: T, i  g7 P                return -1;
/ L6 }) T9 A# x. {8 G2 |$ p' R        }0 z7 L8 u4 A  L! K
        
" o4 `- U! r6 c) M, W5 i        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ a1 L4 @! t* O. K- M! c- I  U

' y2 o, {! p) K* I        while(1)" ~9 o! L4 X# J8 E" a* f& x( [+ F
        {' B/ z4 |& j4 J
                read_MSG_buffer(mem);
3 t9 Q8 L6 _  g5 `  r0 D/ K! t        }               
( y& w- r2 P7 j  `}
& O; j6 w  x' s2 r: R
+ e  f% t  d* b/ Xvoid read_MSG_buffer(int *baseaddr)- p4 \* L1 s, @9 o0 }& ?; ]; e
{, Y7 U) q. R5 t6 k! G! l
        pRX_MSG_PROTOCOL pshreRAM = NULL;( ?0 D$ Y- m" ^- }$ k( ?2 l+ B+ V

5 \+ j! |& ^: `; P) ?        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ k' |  {5 w- l( s  H
1 j% q2 A; C2 \' R4 R* t9 s# Q
        if(pshreRAM->packet_cout != count_copy)- G$ T7 l+ s, P9 W9 V5 \
        {( c( B1 \! x! m  i$ ~' [8 B7 c
                printf("a is %d\n", pshreRAM->a);, ~! c) f6 N$ }; ]3 \2 v% ?
                printf("b is %d\n", pshreRAM->b);
: R% m. q3 y! r* o                printf("count is %d\n", pshreRAM->packet_cout);, ^. o5 f9 p5 A! L: B/ j, v
                count_copy = pshreRAM->packet_cout;
. x* M5 I  f) l2 P6 W        }
0 i$ u- M' {) ~( K7 i        else
/ ^1 H; j$ S7 x! T        {
% L# S+ u% i7 O4 t$ b$ W                printf("No effective message!\n");
! G( ?6 l0 p# T& a        }
  K& J2 o0 r. o}+ |" d7 `; d6 @3 b+ G
: b( s5 r  M! q* _0 R( Q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' x5 M8 Z& ~$ K: V" N  V& L
! F) ]4 L) X  A% @! Y' h3 `' S! _0 N, |
4 y5 W: e" ?! w

' s+ A- f- t! K' O: l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-14 14:24 , Processed in 0.039230 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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