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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* G& ]1 Z: W5 C  I
% w. y' |% s2 ]) W4 @OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>  P# X" b; v4 }2 x9 t' ?) \
#include <unistd.h>7 [7 B- |/ }/ d" R. L; n# U
#include <sys/mman.h>) ?8 H1 O' o* p
#include <sys/types.h>+ t/ S* k- w/ R* ]( ^( R( Q" l
#include <fcntl.h>
& U% z* J8 |+ M* i6 Z
: a) M/ g+ E& h6 B#define SHAER_RAM_BASE_ADDR    (0x80000000)   1 g! ]  V( m) ~" }4 V: e9 N& t

- R8 W5 y$ C5 L& gtypedef struct
' G9 m9 w1 i$ b, ~9 l9 Y{  u+ K% z. n* B3 p! @/ |) p! a
        unsigned int a;- s" N$ @  w: c; g" D+ r2 Y  ^
        unsigned int b;
; ]$ W6 }$ B5 W/ ^/ {        unsigned int packet_cout;
- q! Y4 q! |9 N5 R* {! o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* [3 I6 Y, A' M# z" o, V5 m: ]* a3 U. m# r4 b, \  q  q. Z+ a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ U0 t- j1 f" O% d& ]5 ^  kunsigned int count_copy = 0;8 b( z: L0 B: ~+ [7 b/ v4 a
% I8 t8 O" e( h  k% O, P. O
% h5 \& H* g1 K5 q6 w# N3 ~
int main()% {# R, P4 N5 W
{
7 W- [' B0 w. V        pRX_MSG_PROTOCOL pshreRAM = NULL;8 k9 J8 u; w) k2 e! B" `
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 a* X6 ]( M3 C
2 L* J% H+ p% a4 f: ?" a
        while(1); U2 j- m  q: A, v' r$ B. p6 y' `
        {$ l' M1 Z* h0 X
                read_MSG_buffer(pshreRAM);: d/ p4 p9 d5 H* f0 X( ^) v
        }                6 p& C% V* d# Y6 {! B
}8 o5 k& J+ c5 @& s% i% q4 m

7 }2 w9 U/ S. N# N2 Q9 P6 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  r8 H- W+ i, i& j
{5 Y5 @% W  C6 O( {# Q/ h
        RX_MSG_PROTOCOL buf;
: P1 {7 R! ?* K6 a2 m        " p7 X% x& k8 O# H
        buf.a = pshreRAM->a;% l9 H$ P4 E2 u4 R6 X. C
        buf.b = pshreRAM->b;
; ]* b! Z, }* _% Z* w        buf.packet_cout = pshreRAM->packet_cout;
' i& F4 F# ^! g2 o' c" f% I        8 D. X; Q( ~" _/ i
        if(buf.packet_cout != count_copy)
1 L* N6 X2 ~6 D        {
" _, H( V5 c& F. A, A                printf("a is %d\n", buf.a);
. Y' w, P% i9 v' H4 P( _9 z                printf("b is %d\n", buf.b);
% F* p0 f' W% L! V" m0 u2 X! ]                printf("count is %d\n", buf.packet_cout);. P9 R0 d& a: J
                count_copy = buf.packet_cout;
' A3 a  A! F- @/ m        }2 \) }& ~( Y! ]4 G
        else
( Y# t, c7 }4 G        {$ E; [9 |5 P9 Q7 t8 A8 J& b
                printf("No effective message!");
$ f6 g1 Y) K/ m6 Z9 _2 Q+ P, C& j+ M        }( w6 ?4 b& o7 F) I* v1 S/ C7 R
}+ b9 X  y0 [6 v1 @* T/ X3 r2 T
4 f5 [: q6 N6 E: D" T" P' b

8 w# S+ \9 K6 d' z* J+ M但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 V' Y1 K+ j8 C8 u9 S" R/ ^使用下面代码,对内存使用了mmap函数后:# E$ L: n7 u1 _5 q7 G/ @
#include <stdio.h>1 R# Y* q0 f4 [& i8 a- r
#include <unistd.h>" g: ~. M$ V6 k; C4 e, y; i! Y
#include <sys/mman.h># [$ M  i8 _" p$ p
#include <sys/types.h>/ ~, r7 T2 k) x
#include <fcntl.h>4 {; I' U$ \  v8 M: n
0 f3 W$ M* f1 I1 w
#define SHAER_RAM_BASE_ADDR    (0x80000000)- i5 d  n4 @' f
#define SHAER_RAM_SIZE         (0x20000)   / i1 c+ E+ Z5 n2 c% l

( Q( u( r. j) Y- w9 |& {typedef struct
+ y7 x4 a$ R. T{
# @$ a% k! p7 u        unsigned int a;
. y# ?0 q% ^% C6 {& B( {        unsigned int b;4 |: p; E8 v  l) S5 t8 }% ]
        unsigned int packet_cout;3 w1 k' x$ j; [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 V3 |! k  l  [4 V
8 z4 s5 F# |8 s/ f+ q1 J7 J5 jvoid read_MSG_buffer(int *baseaddr);( v2 K4 W. L- Y
unsigned int count_copy = 0;
0 i. w5 n# t1 n9 d$ H" ?
+ V/ K' _, F4 x$ Y0 sint main()4 P* c) Q& G8 s& Y
{
7 f$ s- C7 s) |, d6 w        int fd;
/ V4 r3 T3 _. X, B$ p6 ~+ h- q1 v9 S        int *mem = NULL;. @. R  H: s4 f# h9 Q3 g+ w
7 R1 o, I' Q, e- Z
        if((fd = open("/dev/mem", O_RDWR)) <0)) Y( f( k- E3 X
        {" X% e0 {5 [: F
                perror("open error");3 V# B5 Z( K' I6 T
                return -1;
& ?# o- ?3 e" h0 x9 |' _3 r6 C$ y        }. }& E5 S6 n* E  Z0 C8 G4 Q! N
        " ^2 ~: T- L. s4 g+ \$ ~# d7 R
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 q6 B: A, \  K6 ?" @
5 [1 g9 q- ~$ f, T3 P# B: x. y" A        while(1)% u! o9 p( j5 z6 w/ i8 @
        {3 g  b; x) n# ]) y
                read_MSG_buffer(mem);
3 u' y/ X2 D8 m/ G. r        }                & S: b6 u& x4 F$ g
}+ p! |% x# T( K

+ U! t5 H4 ^2 ?/ }- Pvoid read_MSG_buffer(int *baseaddr)
8 ?. V4 q* Q& R9 I{
* a6 g/ ^. I7 _9 w! L# ~8 |% j        pRX_MSG_PROTOCOL pshreRAM = NULL;0 l# G( |& ~- }) \5 Y! w7 U

: y! V/ [9 v6 Y1 \" h        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* Q- V& D9 N. s0 G
- h* w) v$ W4 G5 `0 e2 [, o8 Z        if(pshreRAM->packet_cout != count_copy)
& E1 f) F5 H( C0 c6 N% b        {
' G5 g) b, c, E3 K' b2 g5 L                printf("a is %d\n", pshreRAM->a);4 v2 S$ G. C+ [! j6 Q1 E/ K
                printf("b is %d\n", pshreRAM->b);
1 Q8 P+ t0 e8 {! g" h                printf("count is %d\n", pshreRAM->packet_cout);: b7 I2 a0 p& T& H
                count_copy = pshreRAM->packet_cout;
3 r, Z$ N  ^( Y4 C1 |3 K$ |* h        }  L2 J! x# X) k8 f  v. W2 c
        else& i5 C- N6 i& x2 p& X' A
        {
4 e$ Z3 |0 p8 V! d' s  G' n                printf("No effective message!\n");
3 T7 S3 [' q/ N! |        }
/ E& X" Y7 K% k# g5 b, w# j}
8 N& B; n0 a* c% R
- x+ w2 k& u9 G, c" X; S% M没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, a9 `) p8 Z! F9 W4 B9 w, A& d( k: u" J+ X, @( y3 x
2 I8 `$ q" ~& b5 Z5 S' [

4 z- I2 H  S. L8 d
6 W( Z' @8 m" Z& A8 S; t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-20 16:54 , Processed in 0.039067 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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