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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & ~; l3 R3 d' T+ ]

; l+ R" o& }1 }3 w' L0 EOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' F& F5 K7 L, r; A: \/ G#include <unistd.h>9 R2 }6 L; Q8 m$ d7 K( L
#include <sys/mman.h>7 `1 n8 Z+ x4 I. \
#include <sys/types.h>8 {! `8 A) l8 S% j6 F; y
#include <fcntl.h>
% l- P; L# L1 O  C) O: j/ @3 Y3 ?7 V8 F8 L4 F
#define SHAER_RAM_BASE_ADDR    (0x80000000)   0 P8 u# A2 Y2 T6 i
( q: n: ?) i+ {# y3 w) x# [0 n) w) W
typedef struct3 v' t' N" C# t+ T5 h! C$ O' r
{1 C9 ?# ~1 S. a+ w+ ^! S
        unsigned int a;# i" f: F  ~; m5 n4 _3 D
        unsigned int b;
% s* L! d; E0 f        unsigned int packet_cout;2 d# v. F* {6 y- \* e" X, _5 F2 b( C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 K) Y# v/ q! ~$ R

! g( [" T: B, ~8 I5 d3 a+ ?% Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ m7 l* u( k. k" z; a* m
unsigned int count_copy = 0;
! y3 P- c" V3 R$ V5 @
. b6 a4 [- R: x6 p6 t* j6 f; l& E7 A: W5 `
int main()) {* u* D7 e/ X# J0 w1 G
{
, r( }. U7 C  i. D; c* v; C" m3 Q        pRX_MSG_PROTOCOL pshreRAM = NULL;9 E' ?  ^' W6 ~* C) \) _
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 s" K& _/ l1 @2 j; E. g4 B  S, e% J3 B: L4 z! W! c
        while(1)
, S" E, N  e4 F( w) g/ v7 L5 W        {* d! g! c! ^+ Y; \4 J9 \
                read_MSG_buffer(pshreRAM);
7 \3 Y  v% `; s2 @' @+ e+ {: Y        }               
& a8 f' f7 P+ z. X3 w% h' ~}2 \* g) H: K. n" X$ Z* h

' g3 g% L4 P, N9 |) c9 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 [, K5 }* m! z: ]  u{* @' m+ o7 h2 v
        RX_MSG_PROTOCOL buf;; k  I3 }% I2 F0 S6 i8 ?
        
0 A& U" @" N7 G        buf.a = pshreRAM->a;8 t& w; q" e7 [4 t
        buf.b = pshreRAM->b;4 w  w: o8 j2 ^3 K7 A
        buf.packet_cout = pshreRAM->packet_cout;
. X3 @6 v1 c; F        
6 A3 @8 H3 i: A; b* x        if(buf.packet_cout != count_copy)2 e; s* S3 t4 a# T; W- c% y- F
        {- ]9 L- q9 i" ~6 L) }
                printf("a is %d\n", buf.a);  E9 o( B+ b! z) O, {
                printf("b is %d\n", buf.b);
# V% u4 G" z1 P, R# p$ Q* f                printf("count is %d\n", buf.packet_cout);
& R( n7 a* w, ]% E$ N* L                count_copy = buf.packet_cout;0 e& E: V$ p2 y* i+ L
        }
7 o; n# U- J( g2 {6 p+ c3 P' |/ z7 `        else6 J% `' E! B$ u! A5 g6 T9 z
        {3 x! e( s3 |9 E6 K$ Z" I$ C# b
                printf("No effective message!");, t; ?1 t3 H; Y0 x9 w
        }
1 K9 Z6 j9 G2 |+ z8 ]}4 M4 o$ c7 l# w$ p3 [

! h- A+ U5 v8 y6 t$ t* S1 j6 z- y$ U5 J1 E: p4 b# j2 [3 E' W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- I0 [! T$ S5 K; e使用下面代码,对内存使用了mmap函数后:
4 }4 H+ S6 @' L5 h9 \#include <stdio.h>
9 @, I6 c9 s3 \3 A1 B#include <unistd.h>
" @3 I/ y( m; O- L7 S2 T/ j#include <sys/mman.h>1 Z( t& _2 I4 p! c0 o$ i
#include <sys/types.h>5 K1 Z/ @* _+ z5 q$ a# P
#include <fcntl.h>! U* {4 X+ Q8 F0 ~/ d( S5 q' s

/ r4 W( T0 O6 S+ J#define SHAER_RAM_BASE_ADDR    (0x80000000)
; `# j! ]0 A" ^( T. }#define SHAER_RAM_SIZE         (0x20000)   
6 @. n; [! r) F: K" v1 [* n; r9 Q6 N- Q! {7 r
typedef struct
* L0 P% z: P; j/ ^0 o4 ^3 Q{6 d4 K% a& k/ b2 \/ U' x" \/ x
        unsigned int a;
4 ^* V- C- y  p4 H8 L/ G        unsigned int b;
" C( i- z2 v3 ^  S7 A        unsigned int packet_cout;
2 P" C% J. {* A5 a  ?( r" E' ]5 ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 N7 g0 U6 m# \) q. v: {( g
2 Z+ A6 w, i. g4 T- V$ [void read_MSG_buffer(int *baseaddr);( h- w" R5 d( B& T9 F2 Q8 M9 f
unsigned int count_copy = 0;
! ~0 U: m4 d- Z/ G" ^9 U2 }6 b
# E6 y# D% D, G- _- m9 Hint main()
- m( h* I6 F8 |% j{
$ K; e# z6 }7 r7 |7 o( M- }        int fd;
& P1 [( K) I1 y" O2 z; E( O2 g        int *mem = NULL;
( P& i; o, @9 ]: [# ^1 |. P9 p+ y+ o* O( @7 G* ^) k% D
        if((fd = open("/dev/mem", O_RDWR)) <0)
: _( w* T/ T# s" h2 k        {# ~# Z: j. |2 f, h
                perror("open error");, Q7 e2 P6 m5 t2 r9 A
                return -1;
3 u( K  t4 r6 y( z% r, O( n        }- g: s4 x) i$ B/ m! |7 U
        $ k% t" p- w3 S  L- B: _+ S
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& m' w: ]) f: a" j4 V, I; l
3 ~) R. |* |6 `# D# J- ^
        while(1)5 [4 h, i: }5 y$ O5 ^5 w. Z
        {
; w3 V& q6 H3 f                read_MSG_buffer(mem);
% q# C  s$ j6 f2 x- {3 x( p# D, l        }               
) v' [( O) N- ^4 S}" t8 H& ^5 p9 {( a0 y: g! L9 Y
4 P2 E$ _, Y! V
void read_MSG_buffer(int *baseaddr)
! N3 g( y; e; I7 _+ j8 t{; S* [3 B/ U! Y" m- J7 a4 q/ A( v
        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 `# W  A( G5 n3 H6 h6 c3 h0 `4 A
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 }. n# P5 Z9 E* G6 w: h8 ~5 J) I
        if(pshreRAM->packet_cout != count_copy)
5 A: G! o, v* m- v& T4 F        {
" ^% w+ F) k8 m) n! k+ b) m                printf("a is %d\n", pshreRAM->a);+ W7 C& ~! `; B
                printf("b is %d\n", pshreRAM->b);2 ^# q& M/ u, _4 |' E2 l
                printf("count is %d\n", pshreRAM->packet_cout);
( O) q9 s9 N" y; p) q8 e0 ?- _6 M8 S                count_copy = pshreRAM->packet_cout;: h8 e6 z& U5 h, S5 I
        }2 ?9 _: _# Z2 X
        else! s4 K3 h0 ?- X* F
        {3 H8 P6 j  a/ d! d% U/ x6 g; x1 _
                printf("No effective message!\n");" J) T8 R! M- {  {9 ~
        }1 ^, [0 B" F* D- [& L
}% x( J' m1 I' W6 P+ n: I

: v# }# s) p# R' o( @% j4 _7 k没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ |& s2 u, \: p
4 p& _& g6 o$ B3 p! o
2 ]5 ]9 F, d9 k
4 d  c! O! Z6 z6 Y( F' A4 f; k9 l2 P: A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-31 17:06 , Processed in 0.039611 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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