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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! }+ k  f2 h: u+ o

7 d7 a  m; T0 w9 cOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
  F  H4 P& Q" ]3 x1 P+ F#include <unistd.h>0 ?( i. `& l& |4 o! u1 m! W
#include <sys/mman.h>. y; f. ^% q# ~3 K5 ]: V9 a5 t, m
#include <sys/types.h>4 a. U+ ?1 A& {: G- n
#include <fcntl.h>3 ?1 _% m! Y3 j  N7 b+ ]$ R
) t( e& i7 K' Y
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ( H+ o4 @; H8 A1 ~$ K: e* {

& W" ~8 Z6 B& Q7 ]typedef struct3 H5 a/ \; P( P) A
{
. H$ f0 o& d: \1 V! R3 H* D        unsigned int a;
5 R3 S: X; ~! W* F7 r1 k        unsigned int b;7 ?9 `3 [2 ~) e. G
        unsigned int packet_cout;; P. }* R4 `; R" o( T6 G$ M8 q6 D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# X& b. Q+ j9 L3 `4 I2 }' g$ g3 O& t! c

% h$ b- m' Q# l/ u! e5 Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( g3 L- g! m8 D7 p8 @1 k) j- M5 hunsigned int count_copy = 0;& H9 m, B3 g9 q3 o4 q+ q5 N# I

0 a% N- K: ~; O/ M8 P
- i* U6 T+ h- [- g; M2 h* nint main()
: x+ Q; P2 _- m6 l{
  G5 L! I+ U" b+ A        pRX_MSG_PROTOCOL pshreRAM = NULL;, u3 ^2 _3 D0 Z  M
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# B, ~. D% h: _! ?0 F! @: S/ {, n2 P$ b. a& }% v% {
        while(1); h; ^% F1 ]$ f
        {
+ t9 V7 t3 A, [                read_MSG_buffer(pshreRAM);
$ n  P" q7 Q& {  ^0 x        }               
; o' d& l* R- E5 A+ f7 ?+ \5 L6 U}
( b: Z5 t4 f! ~
9 K) S2 u! Z2 u  Y! Z' `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 H- |+ \+ [* o8 G
{
# b& }# n, e! I5 i4 [' ~        RX_MSG_PROTOCOL buf;
- z4 k4 b! N' w& i+ @" r$ M' K7 t        
/ S0 Z; ?7 \7 U2 T" k        buf.a = pshreRAM->a;# _! d) ~2 V9 s; E
        buf.b = pshreRAM->b;
6 C  e( \) r8 @- Y        buf.packet_cout = pshreRAM->packet_cout;
6 ]8 B( o$ j8 H" w- I1 l0 ]        , k, V/ B9 E$ v1 |8 o
        if(buf.packet_cout != count_copy), _% }- v0 u' l: w) w. u! e0 J
        {
, ]# F) J9 E6 A$ \                printf("a is %d\n", buf.a);/ |( @' i6 p' c) T
                printf("b is %d\n", buf.b);' ~/ k# h, u$ f$ z+ v( W/ y
                printf("count is %d\n", buf.packet_cout);
0 l% R! Z  L2 Z2 D1 {                count_copy = buf.packet_cout;8 f: L6 p8 Z4 a+ y7 V' v
        }
+ D4 R  c( l. G  y        else/ F/ u" k7 }' m7 K
        {
1 y" i: c" T* i& v                printf("No effective message!");7 ~* @" i1 K3 @" S! N8 ?
        }; g$ ]" [" t* D% K3 B5 d/ [7 ]
}
* o( b: R; u. r9 a) p/ }% l/ R4 e4 e) w- q

# ?* G  t6 [3 ]9 M7 O6 s4 y9 X但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ k. Z, S3 f# l使用下面代码,对内存使用了mmap函数后:
3 s  h$ _6 Y- N; x#include <stdio.h>, G7 O& C- F1 G) ~0 ~
#include <unistd.h>
* @6 s1 \* _, S#include <sys/mman.h>
1 j$ X& z3 y* O' {% y#include <sys/types.h>& s( H( M4 z1 O5 i
#include <fcntl.h>2 M/ A! x/ v# D& r$ _

" F9 M$ A$ N% @5 Y5 U# M#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ D; a4 C0 C% g: z2 e#define SHAER_RAM_SIZE         (0x20000)   
  i) o. h& O# o- u' e/ P1 ^! l
- N  u; w3 G$ ^typedef struct
! |5 O" \/ |" g3 `. a* g  c7 \{
8 a; s& w" n* G$ ?+ K  m) {" A        unsigned int a;. ~) U4 s3 D4 X6 K2 K1 }8 B
        unsigned int b;  R* W7 r: N7 |% k3 z! H( @
        unsigned int packet_cout;3 ?( U( Q$ K7 |9 D0 k& K& R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. N/ M0 D7 ]5 J  ]8 c4 L. r

; A( [& u1 C" x4 ovoid read_MSG_buffer(int *baseaddr);4 N4 ~4 _- K$ M3 C  G* C
unsigned int count_copy = 0;9 v! ]+ S8 c/ v; P0 O
  r8 A- A% d7 {1 B' }( a; S
int main()1 ]/ ?* w8 T: o' z
{
( B' p3 E9 T% |1 l) Z, x        int fd;1 A& a& \' _$ i( Q  d# I
        int *mem = NULL;( T  Z- F! b" s# X5 ~0 ]: f4 @

1 Y- C* m2 H" A+ M; e$ Y6 y        if((fd = open("/dev/mem", O_RDWR)) <0)$ o9 W2 ?1 ^- X8 ^5 v* ^
        {5 U7 p) Q# P. h7 D
                perror("open error");0 [1 C" D3 v$ Y- y; [7 j- N8 j
                return -1;
3 h$ O. C- x5 T; y8 [        }' l6 |; n1 A  e% g5 x$ A
        8 G9 c; G) {; k% h+ p1 o
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, Z8 t$ X# D" K- K9 r1 _" G
: j& ?/ L: \% t1 g        while(1)6 E; y2 a7 D0 Q! X# O6 H+ a
        {
' Q& a4 n9 c' G1 w                read_MSG_buffer(mem);
. I$ w& F* ]/ S- F7 Y0 d        }               
( x; C2 c! Y1 }7 y( s- A% J; d' O}
  y6 A8 o# g' }+ p0 W/ a0 z, V/ Z$ i) S2 r$ f
void read_MSG_buffer(int *baseaddr)
: ]+ F: g, n: N# l+ k, V1 T1 Y{( N0 X1 J" N& g! O' i) e
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ B5 h& M; J4 {
* x9 I2 j! q6 r7 S% {" c$ S        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 m5 b3 w! K1 a5 b1 B$ q/ S. ~; \) f
        if(pshreRAM->packet_cout != count_copy)+ O& ^; m- b: b
        {; r7 K/ z& T+ S9 x0 E# D& T2 x
                printf("a is %d\n", pshreRAM->a);8 e5 [9 t! }/ T, j2 f4 q) b5 n2 t
                printf("b is %d\n", pshreRAM->b);! o) h4 X7 u; m4 O) O
                printf("count is %d\n", pshreRAM->packet_cout);( t2 L0 H7 h5 f0 ?  G. ]
                count_copy = pshreRAM->packet_cout;
! E) V8 q6 I  I' a6 r" }# b" m) Y        }
# `. z: |# N9 o( T        else1 I* Y- f4 m! n: c$ h
        {
( g' }5 {( C$ A, u, F9 v! Q( z                printf("No effective message!\n");
% W% d* y7 E( _: G3 c        }
" u" w/ q5 R7 B, A% P}! J4 X3 P3 a0 Q" q1 p; k/ j5 N6 w2 D
" N/ o- H8 U# I+ F3 j' Z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! B5 h( |5 m' j# }/ |1 z) e+ |: X1 Z0 v
% E+ y/ M9 }$ \% i
: N$ x: B3 X. b8 f* }  i7 a
0 f9 I9 H& a7 ~# K) E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-11 11:17 , Processed in 0.054436 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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