OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( l+ a8 ?3 V7 p. b7 ]" S
# k" {# ^9 X9 S( Z5 p
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: {; m. S& U5 ?#include <unistd.h>
7 p( }6 d% m+ V5 V#include <sys/mman.h>6 `* ]) ]$ y5 I7 k' r
#include <sys/types.h>
4 N4 r) j/ u  A- O#include <fcntl.h>
8 U0 r. K! M7 c/ z
+ R6 H' I- S) b; X, ^% L& z$ _#define SHAER_RAM_BASE_ADDR    (0x80000000)   " n& c+ B8 H0 s0 U8 N. N9 ?, u

( i! k% K9 q% E/ w. N7 i4 _9 Ktypedef struct
( ]& v9 c/ e. n% F& q% l{7 _9 N/ {  x! {1 N5 J
        unsigned int a;
% {4 F( a8 J/ g- c; A+ j$ j        unsigned int b;" c, f- Y$ ~3 G
        unsigned int packet_cout;6 w, i: o, G* M5 }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ [3 g' c8 Y7 A4 [# G- Y/ G2 E

! y: V( w4 ^' G/ |, @3 }" t0 L+ bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# x, l- y6 I% t; S$ `# X0 K0 {unsigned int count_copy = 0;- g$ y; P2 U! a& P+ b( X5 d: ~: c

- X9 v( l, w+ ?# E& x2 q3 W# m( p- P$ U# A8 s' d* F
int main()8 E$ m$ X( W/ x
{' J% f& W8 @; P. T+ o, L) `
        pRX_MSG_PROTOCOL pshreRAM = NULL;6 j7 Q+ h) T8 u0 }/ m. W+ ]8 |1 X. ?
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& B, o4 d& m4 y( i# w: E
6 b* y6 B8 i- Z( K1 o) ]# Q* U: V3 D& D        while(1), L' D1 o) w8 [. t+ U6 A' N7 [) b6 h
        {
- g6 w$ u8 s5 i9 A  m7 S0 x0 C                read_MSG_buffer(pshreRAM);
! H3 G" T* s) l        }               
& E9 J# }  i# E& T. v( F}: V& ^4 D' u# E/ E* `

1 y# q6 f0 {% A) a; v8 H& gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% G! M8 i# `' K3 a; W! w" B
{
8 w2 {4 F! `/ p1 \        RX_MSG_PROTOCOL buf;
+ l6 j+ q% G9 p; ]        $ v5 ]$ S/ }1 [7 \/ ^- j' R6 X
        buf.a = pshreRAM->a;9 X9 m3 v0 [' `" P6 ^4 R
        buf.b = pshreRAM->b;6 B0 S1 S5 }6 u2 u
        buf.packet_cout = pshreRAM->packet_cout;
, J! f# s1 ^2 ?2 r5 p        
! U, U+ B  n: K. J) Q. A        if(buf.packet_cout != count_copy)
/ D7 i$ y8 Z; }        {
7 K1 g6 }6 f6 a& }                printf("a is %d\n", buf.a);
  ?8 V/ P; D* b' I                printf("b is %d\n", buf.b);
5 V: [' G/ U; y. F7 D                printf("count is %d\n", buf.packet_cout);
' k3 @; k; C3 Y4 X% d                count_copy = buf.packet_cout;
3 `! C* c# Q% Q: J+ I        }
) \+ U) n5 V; G) ?9 @- N        else8 I  o% v3 R! N7 O! T
        {! r/ T0 h! G! v& O5 z2 L" F
                printf("No effective message!");
2 y* G- C& Y( o1 a4 f' s3 P        }
8 l+ Y8 p* c  D0 N2 e}6 [! ]5 N/ k. b! b4 M* ~  T/ ]8 I# K

8 Y; s7 s/ r2 |4 U
' H9 J+ L: |- j% Y, c+ ]* S但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ V/ u, F" a; P  x  z使用下面代码,对内存使用了mmap函数后:! d  P: Z3 G$ z
#include <stdio.h>
! x3 d  m6 [& X8 M5 w& @# r7 l  Y#include <unistd.h>
8 S" o- {6 J2 f; C#include <sys/mman.h>
' C% ^# a& e) u$ C; t* o% C#include <sys/types.h>
6 o% Z) k0 w6 e' L. ~% X7 I+ s  U#include <fcntl.h>
# u7 A3 P1 |" x: ~" l
# e. v; o$ D/ g/ g1 y- d#define SHAER_RAM_BASE_ADDR    (0x80000000)) k8 x$ l, z0 r
#define SHAER_RAM_SIZE         (0x20000)   . X: e. z' i8 h8 f) `6 l5 A

# x9 O9 I, j( s! m4 e7 k2 Xtypedef struct: W5 X- d9 z$ r- Y* N* t6 b6 `
{
- g6 D% ?) T5 u# Q0 I  V        unsigned int a;9 |- X# K' |" s% ^: v, c
        unsigned int b;5 D, w" G7 ]  G( b9 E6 n
        unsigned int packet_cout;
8 `5 f: o. X- Q9 Z  _7 E, ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ H& {  q" R2 c6 Z- S

9 ~+ t7 H( E" svoid read_MSG_buffer(int *baseaddr);
3 ]# r. ]. z) ^; |, [6 Tunsigned int count_copy = 0;
9 f* r% @# _2 g1 Q( Q% j1 c
6 l* ]1 O5 w6 i7 L0 N% sint main()# i& ^1 p& D1 H0 F
{$ p, T  \5 G' Z& c0 {
        int fd;
8 Z! _" j4 _; a6 ?        int *mem = NULL;
  F) `! k9 L2 y  b+ X* q, D- U+ s6 v) ~' b: Q8 x
        if((fd = open("/dev/mem", O_RDWR)) <0)
: j  M" Q& G0 m+ n' M        {  ]* u$ `: `3 @3 _3 b) N
                perror("open error");$ J( u  U$ L$ o2 N8 r
                return -1;, `2 J% F1 K. a; c
        }& }0 a  ?4 A, R* Y
        
; W3 c! I, l2 O1 w- A" Q( x        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) D  W/ k6 U' n$ S8 |4 P6 k9 ]) H% X- {2 J
        while(1)
+ o5 H' e+ K) L" R/ |2 B        {
, A; ]3 Q4 N' g+ t8 f                read_MSG_buffer(mem);
0 d. i) Y3 U5 e2 ?" }% E" ~) ~        }                % [5 V$ I6 G! S9 a* M+ s
}3 `2 o4 [  y- Y( c

. W/ _( w8 W* s+ Cvoid read_MSG_buffer(int *baseaddr)
, ~& p2 F. t# a9 z7 E- i6 I{6 \) [- }8 O9 o& n5 y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ V7 e+ V: W( \! G. o% g: K+ L- }  Z% c  y0 [6 ]2 ^( H: c
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 M" i6 a- E! f( R
- b% a. Z% A8 x3 B3 r
        if(pshreRAM->packet_cout != count_copy)
: @) P  P0 R. c. o* [        {
" D+ c) {; }' `  i                printf("a is %d\n", pshreRAM->a);3 b" q: H* V2 x* ^$ l
                printf("b is %d\n", pshreRAM->b);  }9 M$ t1 `1 ]; ?
                printf("count is %d\n", pshreRAM->packet_cout);
3 n6 I7 T- _5 g4 Z# t$ w$ j                count_copy = pshreRAM->packet_cout;
1 W5 }% @6 z, y* M. x) ]. A        }, W" H+ L, b% L
        else
+ p  r& p! s! w+ u        {' {8 ^. g* N1 q5 J
                printf("No effective message!\n");. v% c# R9 T/ H% W; S
        }
- n5 j6 E( Z! U$ o: I# _}$ f  \2 S0 u6 I/ ?% Y

( Z6 x6 x1 R  \8 C没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 v. N6 @( B0 Z% x6 z* }: [6 s3 q# L) l4 V, T0 W9 ~
) w% |4 |+ W3 U& `; w$ `* o

4 I* H+ g8 b# p- U1 h; l0 H3 a5 h* @1 k+ e3 h0 x. T1 \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-26 23:07 , Processed in 0.038597 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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