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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * ~& X$ T* J( i

& t& m/ ~/ W8 U, k4 sOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& x- e! W& E1 l5 D4 E
#include <unistd.h>
- s5 u. A, A: r: D7 p. V#include <sys/mman.h>3 q1 S1 @2 `- @2 k
#include <sys/types.h>  W* h6 _0 y6 ?$ W
#include <fcntl.h>) ]+ }( @4 D, u" |9 V0 R* v

' L6 C! F8 ^' i7 V6 h' _#define SHAER_RAM_BASE_ADDR    (0x80000000)   4 R3 \2 w) h- D% }+ J; t0 o

& G% u, \' s& I1 Qtypedef struct
% O% q; ?4 }3 n{2 Z3 ~: m; O& _. k+ V
        unsigned int a;, O! l2 L- Z  C0 Y# z0 K; G" p1 @; ^
        unsigned int b;
( Z6 W- I5 w5 p' ~" d# O1 S3 Q        unsigned int packet_cout;  G3 w% O8 S  `# J8 r0 X, ^: A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 }& n0 d! O8 s" |/ Z9 a
" m2 K& P4 ?% f" ?. d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 w- e0 m; r) f7 U1 {6 `
unsigned int count_copy = 0;
$ `# K+ w7 }& r9 y" M' i/ `* e" s/ v4 @. @: \9 g

% V/ [3 @* e  z3 n# X# D  [; oint main()
- _0 K" W. P' ~4 D{3 W+ [. q6 `% D" G* x
        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 n% w0 B( q' a+ y& E        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' _1 p+ _, b, H9 U9 O- x. I
* \1 F) K0 q( P8 `( c3 J6 ]
        while(1)$ w4 m  R8 Y7 U( @3 i
        {
2 t; l/ \* K# ]' K" K6 q+ q& x                read_MSG_buffer(pshreRAM);" L4 E0 N9 z  B$ y" J% V/ b
        }               
# j5 L9 x7 H) z; n- q1 A}& q" J8 j+ j* l# l5 Y4 u

6 O6 a' G6 \( q( Y& Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' O9 h- {3 S# K1 m) L- R{
* x( R3 @; B& ~# w        RX_MSG_PROTOCOL buf;3 c# D* o8 d( Q: t0 g8 X( k3 a/ q
        , N" g( i8 s2 ?. u$ s
        buf.a = pshreRAM->a;
- D7 E: m0 L5 t& j# X$ B        buf.b = pshreRAM->b;
* G1 v1 n) [" S5 w0 M) b        buf.packet_cout = pshreRAM->packet_cout;
& r* x7 @# r9 v0 r        
9 L0 E; @. x6 ]1 I7 V        if(buf.packet_cout != count_copy)
1 ]4 H; J9 |5 \# {2 J5 y        {
) O! K% h9 h; r2 d' Y* e                printf("a is %d\n", buf.a);/ U# l5 o  i$ A4 }9 j5 }( g; t$ u
                printf("b is %d\n", buf.b);$ Q/ r2 w# a# D2 R% b
                printf("count is %d\n", buf.packet_cout);
: `- c6 Z" z. ~" p1 D* d) f                count_copy = buf.packet_cout;
0 r9 E  b- b/ Z$ ~5 G        }
; ]7 _+ S: u8 y: `! m/ W        else
/ \6 J; E5 H2 ^; D        {, ]* m* D4 q# T- S6 ]
                printf("No effective message!");
0 d2 H; ^: ~9 Z+ b3 T* |) H4 ]        }
" p7 G3 b, w7 d2 W- }! ^}/ j; a' q) V9 o6 U2 I
3 A+ Q7 q$ u! S3 ^' ?/ Q$ x- B
+ ?2 m; Z1 H! E5 p- X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* ^. r& e5 W* b& v& `4 o# C2 x使用下面代码,对内存使用了mmap函数后:
2 B; ^% b4 d2 ?; x# N& f  v) g#include <stdio.h>& u& X4 K9 Q# F
#include <unistd.h>
( `4 t1 }: Q6 m; g5 @* o1 s) b#include <sys/mman.h>) R0 V+ z) ^' `. {4 s2 L
#include <sys/types.h>
/ ^3 ~9 P$ b3 R+ a' d#include <fcntl.h>( ]+ b+ L8 ]" A& _& L

% Q  r' M4 ]* o/ E& e- G#define SHAER_RAM_BASE_ADDR    (0x80000000)) a! c$ v3 Q6 m: x
#define SHAER_RAM_SIZE         (0x20000)   
* Y$ w. Y$ {* Z3 m9 W. W# X* X% C5 {9 D; C7 L
typedef struct
( l% S, V& J" H4 l: c3 }{5 u5 W% U; {8 {. ]3 B
        unsigned int a;+ x; C5 A; s( j( `* V6 i8 n
        unsigned int b;' u- Q* z; n2 R& G
        unsigned int packet_cout;
! g% B' Z& e& _3 z+ ^: N* ^( {$ J}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 @) B; e' U+ T" z' M, N: r
% X0 A0 ^3 j3 O! U* Y1 G- ^
void read_MSG_buffer(int *baseaddr);
/ Z' q3 d3 m/ T5 K! Sunsigned int count_copy = 0;
1 Z3 f9 U2 v( f2 |3 w
) Z3 p* b' K, D! P6 }/ {int main()7 K2 M2 S3 I; n3 M( V, ~! C* Q3 Z
{; t& }( ]$ k) \5 v
        int fd;/ E5 |2 L& _. v" l  |, V3 D+ `
        int *mem = NULL;
5 r& l. o* e8 d8 y. w$ t6 H, y
9 h- [& J% k6 U/ c* m# m0 R. @        if((fd = open("/dev/mem", O_RDWR)) <0)
- q: o) S# ^7 Q* D+ _0 X        {
# Q& g4 {$ ~4 O0 N                perror("open error");
8 l: p' g$ ]6 z8 ^                return -1;
) G0 o" L, ~7 _        }( |5 V- J+ c( H# o; W9 a7 ^' _) X, X
        5 u1 E" j+ k: V& q. U
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) t5 W5 T4 g8 R; I& `
+ ~$ B  J* {: M. q0 ^$ @2 Y/ ~        while(1)
& |: O+ d& M. h  F        {; P  i& o" y; y' ]! k8 K; T5 e
                read_MSG_buffer(mem);- k$ P, n0 X$ A; [4 o" d
        }               
6 k* i6 v, Y" U, }0 E}
8 q; h6 g) a" S; w9 K
6 B4 C& Y4 W. G! U. ?void read_MSG_buffer(int *baseaddr)$ S$ c: `4 o4 e2 {. {# n9 Q$ ]/ s) \6 g4 F
{
* W# v% n$ B" ~7 r        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ H# ]* p6 M6 |1 i! V1 s  m. U6 F8 _$ N# j" E/ h$ p) m
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# i4 e, J4 E* w0 f0 v7 p
- s/ v. i# v$ K+ f! u6 j: E; L& E        if(pshreRAM->packet_cout != count_copy)% }- I; g9 u, z  W4 R
        {9 x1 a0 e5 E. b
                printf("a is %d\n", pshreRAM->a);
. i' x" I  u  ~& }- X  \) b                printf("b is %d\n", pshreRAM->b);2 s% q& d* i3 y& a! {# A! Q
                printf("count is %d\n", pshreRAM->packet_cout);
& F' M7 X5 J  S- t7 R) x% K                count_copy = pshreRAM->packet_cout;
5 k4 @1 Y+ S7 B- A& r        }- A8 @$ m& f" `) \0 i4 D: t. c
        else( o% Q- m2 `2 u
        {
" l" G3 t+ C: ?9 _% k& Q' g  K                printf("No effective message!\n");& E, x& [% Q( \' [8 t4 i
        }
) u/ n* y4 q" i' X4 l}# ~% R# i' u8 Q! C" J# U

: Z8 [0 k( Y! ?) S/ M6 O( C5 s; P没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% N" A1 ?: \% O7 K
: {! Z$ w, o& s( \4 q- y+ B
6 `, F# ]4 M. x. Q0 ~4 k
  D9 x5 X1 \8 B" o( J) N
+ S& T' q2 r4 H' J6 m! Y. k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-11 08:12 , Processed in 0.039875 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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