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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 H0 C9 d6 W% k& @: I6 k
) B& M: q; F: z7 t, U+ ?. X6 c+ IOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 A. i- a8 \+ ]& A( D0 o#include <unistd.h>
+ p0 Q2 }/ C. [/ B) q+ z#include <sys/mman.h>' L. H" l3 E; E
#include <sys/types.h>: l& t7 u. e' |
#include <fcntl.h>$ ^3 S  i2 d( a. b) A4 z$ G. F

  q$ v4 x, P( E2 y& h% s#define SHAER_RAM_BASE_ADDR    (0x80000000)   2 _+ Z6 `) d. O/ g3 q

+ {" G$ p- M( q( t( j; Mtypedef struct
2 H+ _, Z8 x" C: i& u{4 A& b5 r0 `4 k
        unsigned int a;) E% X0 M4 m' x) r6 a9 L
        unsigned int b;" d. E3 I8 {( q' O
        unsigned int packet_cout;8 K7 ^4 S9 S9 S# H/ R' ^( m1 a3 g7 e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& ?8 B: U# t) C8 e8 ^% a

0 G; z& [3 l/ A7 Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);$ e" ?3 G) o6 X3 p( l3 T: y( ]" b" ?
unsigned int count_copy = 0;& x6 @' b0 m/ d/ j. o

' H4 V, c: l' y7 L4 M9 z3 {3 j$ B& O5 W# v. L
int main()! F1 L' C' x) c/ Q8 J3 T1 G6 l
{
" |! P. j# w) n! x- h; a8 `" s        pRX_MSG_PROTOCOL pshreRAM = NULL;9 P2 H9 w2 q; N  x7 A
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ y: @9 q0 ~+ c4 e9 F, ?% P
2 o% e6 \1 s0 T9 r4 S6 @
        while(1)
( e6 A* z% K0 r# T: ]        {  W6 \7 h+ l$ Q
                read_MSG_buffer(pshreRAM);
( L+ Q6 a- d1 r$ R: \        }                * P7 v' [9 z& s& m
}6 A" ?* m# V; W

: g* w& F- J* D& avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* L& T$ J- z2 R6 k1 T1 h$ G9 Z; l8 A, j( e{
4 W. F% x7 J1 }& r        RX_MSG_PROTOCOL buf;' Y- q1 t5 T% m1 Y
        
  g1 T$ p: h; I7 `* Z! G        buf.a = pshreRAM->a;% m" d% Q' [! {; T, W
        buf.b = pshreRAM->b;4 B: D6 S7 h1 r3 j& F9 W: d
        buf.packet_cout = pshreRAM->packet_cout;+ i2 O* c- m  G- P2 E+ p. d# \
        $ G) ]' j3 _/ V" O, ~
        if(buf.packet_cout != count_copy)
* m8 G) M' E$ w, Z        {6 ^8 g4 o' G/ d  W
                printf("a is %d\n", buf.a);# Y& O' U* Y3 Z" r( v. d
                printf("b is %d\n", buf.b);
& s% P+ S* O5 s# G                printf("count is %d\n", buf.packet_cout);
, P* C+ L) |" L( a3 c. m/ H                count_copy = buf.packet_cout;* S+ ]8 f! x3 v7 |5 q
        }' z, N0 w' a# K2 G7 v* A& p
        else
- R3 S1 L! {8 |- u) M& p        {2 n% X0 G0 A) X. {/ s& n: g! L
                printf("No effective message!");% C1 E: B$ U# _( v/ t0 N: O1 m: ?
        }# N* d' d  S& p4 h; W
}
/ m' p. l" A7 Y1 |" o6 y$ E
6 ]  C4 S% F. E) ?+ n3 |' `+ ~  G' S4 m3 D% ~, O) S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 Z$ W6 Q8 e. D0 ]1 e- q& _1 U
使用下面代码,对内存使用了mmap函数后:
; A/ R, E% C* L6 o( \! i8 N#include <stdio.h>
) Q" [% |( ~' O#include <unistd.h>
5 j+ ?! M7 l9 o% k4 k#include <sys/mman.h>3 I- k: t3 }' t) T0 F
#include <sys/types.h>- @0 M  ~  P2 E
#include <fcntl.h>3 V0 S, F$ {* b! Y5 t; [
- r, M0 L( i3 G- d2 D
#define SHAER_RAM_BASE_ADDR    (0x80000000)4 P' N$ ~( J" G. e* R! m
#define SHAER_RAM_SIZE         (0x20000)   
5 r& Z& s6 E& p) E8 g
! m* I+ p# C3 u- a: otypedef struct: X5 \( w/ v) i; p* P1 _
{
6 f+ e6 h* R; I% g% T$ q: m0 x        unsigned int a;
* w7 h; \/ h% a2 K, _3 e& x        unsigned int b;
2 y2 y0 `) C& D* W7 P) z: f        unsigned int packet_cout;* D1 Z% M! e! V# e6 `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ s6 R1 N  w$ K5 c+ D3 `% g

8 b4 |( B" ], jvoid read_MSG_buffer(int *baseaddr);9 F8 i4 s* j+ [- Q
unsigned int count_copy = 0;9 ]+ |; ], p6 A5 d) s: r# ^: q3 y

* R9 r8 F7 w# p) e2 D- ]: ~int main()
* I7 @/ A) ?5 q, G; y/ }{7 V: X" D0 `' t$ b5 P  M
        int fd;7 v- L, ~2 [! z7 B
        int *mem = NULL;  W7 B/ y4 y$ r; ?) S5 I' e
& L1 h2 N9 L/ ]: C" M5 g+ e2 d
        if((fd = open("/dev/mem", O_RDWR)) <0)
! Y& ^& ]& G0 N; r" U& ?        {
, q: U0 Z% I3 ~4 ?  U3 s5 U4 t" i                perror("open error");# o6 M$ z2 e; z4 v( F6 `
                return -1;- f0 A/ y9 u6 G0 n# d
        }
7 F; z: X; k6 Y        
7 o4 e1 K; G. d+ c, j3 `* k        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( `* p, n2 ?! Z; G2 A$ ^: _0 p" T
        while(1)
3 g3 T' g- |1 H2 g8 B        {
% D0 u3 q' a9 U                read_MSG_buffer(mem);) D' V& o, k4 t, r( y: G9 P
        }               
! z" O/ Z9 ^2 G' D}
! {2 g' F; N* b: B
1 I% F( e) }  fvoid read_MSG_buffer(int *baseaddr)  p. g: i/ V: q$ k
{, \4 B3 V% A! S% b9 c& d
        pRX_MSG_PROTOCOL pshreRAM = NULL;
; S- ]! |  {: S$ i1 a0 n5 B3 `
- h1 l+ O6 F: f7 |9 Y. ^5 Q0 G        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 T/ H& H5 t5 W$ I, M
+ ?: Z- k& d$ V; \        if(pshreRAM->packet_cout != count_copy)) r( {0 e8 h# m) {: i
        {: i, f2 R4 h1 W9 E8 [
                printf("a is %d\n", pshreRAM->a);& F% v: h  k4 D6 Y7 K6 Q
                printf("b is %d\n", pshreRAM->b);
: Q) E9 m; c" F" I/ `1 r                printf("count is %d\n", pshreRAM->packet_cout);: d; i: X" _: w
                count_copy = pshreRAM->packet_cout;- _# N4 d: N: U$ I
        }
, a2 o3 B9 ~8 X' y7 r6 l/ K# z        else
9 i5 {* Y" w" C        {
0 Y, ?* {/ }' K" |) A                printf("No effective message!\n");  E0 S6 t! _( a) G
        }
; P( g% m" |0 H}+ J8 e3 ~! B6 Q; f
1 {4 w% Z% h- A8 e1 G: R6 d9 Q1 g5 b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; f7 _2 k( q" @& ]! \4 y! d

; \4 V$ }% I! E: V4 O7 }+ r
8 Q4 E" \" b; L& w7 ]: _
3 ^5 _; ]  ]1 G9 _- z, ^
/ ~( n& }. \+ U2 e& j8 `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-15 01:49 , Processed in 0.042525 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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