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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 G, G2 C' i8 E6 H8 P- `0 z4 u6 d7 ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) n; W$ e4 `- g* b" a#include <unistd.h>6 V. ^- U, k  |3 B0 l) ?
#include <sys/mman.h>) e1 G8 ]) q0 X' a/ H
#include <sys/types.h>% F( f; \" U8 {- F6 F. Y' B0 i
#include <fcntl.h>! G6 N1 x0 p( `, l& R0 \6 r6 B

0 v: ]- l6 A* f6 x#define SHAER_RAM_BASE_ADDR    (0x80000000)   ; T5 v) ?4 {% r5 h+ f" B6 @; |0 I5 L

( n. |) R  }$ {4 Vtypedef struct) u/ |# a! o+ M4 _) Q+ X7 W
{
) O6 ~% N6 k2 [% |+ f3 c8 c        unsigned int a;; d2 m, Q8 ]( z/ X2 N
        unsigned int b;( z$ M/ M. x+ j) O
        unsigned int packet_cout;% Q, L% V9 ~: M' V! V! B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* f! H9 z/ D5 A. t* l& B3 k$ s; D* @& |; d+ Z, g/ [% ?/ k  H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 F. ?6 Q/ D5 e9 funsigned int count_copy = 0;
# Z! N0 O7 r# j1 H% T& v
& p6 b2 T& I" P7 J$ h5 ^# h; e$ ?% x" K( `: F
int main()
/ F. O: l" h2 H4 r/ D{! @4 s. J: l5 q. E0 c' k1 t
        pRX_MSG_PROTOCOL pshreRAM = NULL;# w/ s' H: m3 A  H9 l* ^& {0 f) Y
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 F. R) O+ \/ x; K- Z$ k; y0 z8 j+ T% s: Z6 n- B% Q  e
        while(1)
0 k5 _7 \% g/ v5 D$ \        {! v, d) p( m- c5 Y% x# r
                read_MSG_buffer(pshreRAM);
6 C! E% F; l+ g" Y+ Y$ \        }               
* a! X, @- ^$ B7 `. [' ]}
: ?1 a* o7 u8 p! G) V: G' x+ Q( L3 D. o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  e- M% }7 U* H{
/ T0 |6 E' S1 l+ i( y9 p/ O" |# y        RX_MSG_PROTOCOL buf;
2 A  ]1 [4 o; v. a% u  h! J% X4 a        - ]0 m4 q- L# L4 v0 J
        buf.a = pshreRAM->a;
4 A* U' x3 g9 ]  L        buf.b = pshreRAM->b;$ D* D+ m5 G0 s
        buf.packet_cout = pshreRAM->packet_cout;
4 g0 P" G4 @8 i6 m6 D" S        
8 |/ I# P) D! N; ^$ B        if(buf.packet_cout != count_copy)
! k0 I$ O3 M; v( p2 U- b# `* H" _1 S        {' S+ s4 D* r$ h6 s* v* p
                printf("a is %d\n", buf.a);3 x6 A! b8 S: N" v5 \; E
                printf("b is %d\n", buf.b);# ^* I: {' }) j- I9 H
                printf("count is %d\n", buf.packet_cout);- S3 v: e5 f' ]
                count_copy = buf.packet_cout;
( R0 f7 g1 F$ l) x9 l! Q        }: i$ f5 l  v% p3 i1 c! B1 ~
        else
4 Q- w: _8 j  y' w, p        {
+ @5 x+ h; Y( E* t6 U( |                printf("No effective message!");2 N& a4 G" Y& c# D
        }
  S% w7 n6 e0 x* G5 ^}
5 w1 U/ D6 M3 N! X! t1 w' Y9 r  u4 {2 X& {

" w; u) l+ E3 G3 R4 }; J但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 e) m& b' P1 J. z. S
使用下面代码,对内存使用了mmap函数后:8 a4 r3 j  l' J- D
#include <stdio.h>
( I: p+ X& z8 P: \2 t" k' X  u0 g#include <unistd.h>& z0 B2 E& J) j. C
#include <sys/mman.h>
4 O  ~0 ?, w" z! ~* P#include <sys/types.h>4 D) y4 R" a, l( q( u
#include <fcntl.h>
4 r6 H8 U5 E" {9 d* H
: m  T, p' r& n) f#define SHAER_RAM_BASE_ADDR    (0x80000000)
" X0 |( \- W  k#define SHAER_RAM_SIZE         (0x20000)   2 A/ {; E' m' {: f% i( d* V
# M( I: d# B/ R/ g( O
typedef struct6 N/ o- i& p7 i5 X
{
( T$ O. Z( Y: Q        unsigned int a;
; G3 ]" J6 Z% j% E" _        unsigned int b;
: U9 Q/ g+ x8 c) H3 p% y  S        unsigned int packet_cout;
8 h! j& L' O2 f8 a9 ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 H5 t* U$ z* P3 o
+ @& X7 v$ U+ v% o, f
void read_MSG_buffer(int *baseaddr);( e$ B. c% x8 _8 s9 b& D
unsigned int count_copy = 0;
  `6 y' q8 [0 x0 N' I
: w! a' k2 h! q5 |int main()
" R$ u5 o% Y/ f! n{& O" Y0 L. V* Z6 H: a- J, @0 ~) C) @
        int fd;. c4 E# x4 ]) C8 ^
        int *mem = NULL;% R/ v1 G- l( E! E& o

* O+ g) N4 q2 ^1 ]* d. y        if((fd = open("/dev/mem", O_RDWR)) <0)
! y# f0 L7 A9 ^6 G9 p- j- v6 w        {% Q" ^! p- B  s5 ~$ O
                perror("open error");
' Z. ~; b* L# A3 y( T; h                return -1;
1 u1 J0 k7 y- c% i) N* n" ?8 \/ R* W        }
. M; V: I5 n: y; ^2 ]: @' G  n        
9 e! z1 }5 k! F. m        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# _; I" h' e6 K
6 U6 H7 |+ c7 l4 h; _+ H, ]' h
        while(1)0 x; K! Q( {5 ]" \
        {8 u2 e7 f; h& P% g1 K
                read_MSG_buffer(mem);
  j' n4 s, j! c9 O2 p# o3 D7 U        }                & z8 a5 P, ]# y1 D. y" M" K2 d
}
' x3 f! T3 Q* C( U1 u
  C* j6 q0 `% I4 vvoid read_MSG_buffer(int *baseaddr)# L) A+ u+ ~( B; l: H/ ~" t8 G  m0 |4 D
{
$ I( g% _$ z- ^) h9 m; I/ `. ]( v        pRX_MSG_PROTOCOL pshreRAM = NULL;& X" V" |# r* ^/ z4 n2 j3 V7 w

0 ~. \" a' u' m! b) ~/ u        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; X) c  o0 g3 }' z7 x! `4 s7 h, B3 X- z; D+ n& v+ n5 x
        if(pshreRAM->packet_cout != count_copy); N7 Q* X1 @* p/ S
        {
0 C: j4 R% n+ t# q                printf("a is %d\n", pshreRAM->a);6 D- w' b6 i' n) P5 @; A2 q* j% g
                printf("b is %d\n", pshreRAM->b);2 x$ ^; f, F: ?2 C" P9 w. G
                printf("count is %d\n", pshreRAM->packet_cout);
$ G" `5 J& ]0 m' c                count_copy = pshreRAM->packet_cout;) T0 U- B2 Y3 C+ _: P, v
        }1 Q9 W& V2 ~7 D( p1 }1 C
        else
1 i9 ?+ \6 F! X) k# P' K8 G        {' n2 _7 g. x9 \) q2 A- ]8 ?" N8 V
                printf("No effective message!\n");+ w- O2 m9 F0 y, E" w9 G% n! \: C! j
        }* P" A& q* g, q( l# Q" W# t
}7 L0 |. o; I5 h% K& p
; `7 K* A" i  Q% C+ C+ v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 U; q- s) P- o& m
+ V5 F# S8 j$ k- g9 X
( X4 {- }* @7 l( g# L+ U) S/ L3 v) q7 O* D. [+ b, \

% f2 d4 x# H- x1 X3 @1 q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-28 08:42 , Processed in 0.041003 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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