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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + j5 B5 E. j3 q0 U5 ?( p
. a- T/ ^# b9 B" U4 I2 y5 ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% N5 h$ G5 |" a% Q; ?4 ]#include <unistd.h>
+ |; f& i$ Z% f' P& V#include <sys/mman.h>
9 E' w. Z) v- C2 {#include <sys/types.h>+ u1 p/ ^: b# _3 v# h4 {
#include <fcntl.h>
4 y) J2 K. u0 z/ d/ `' A9 r! c# p- U( J
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 G. Y9 n/ @" J% v" X5 d# F) |
. v3 R- @# G- ~. {  Ttypedef struct) l  c  H- O* k$ d7 a
{
5 c/ H' s% j) {  ~        unsigned int a;
+ Y4 w) d. F  R" r! `        unsigned int b;
" V8 }* h2 F0 x* w        unsigned int packet_cout;
5 D% p" `+ ^* |5 Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ A' B' }4 j+ G; D
: ~: A4 d# r+ {" E( E8 i: Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- n  o8 p- O& `* funsigned int count_copy = 0;7 w* A7 k" m2 [& J% S

/ K) n9 r7 B7 s9 Y/ Y6 ?4 w0 q; Z# v2 T- W4 [- ^2 K* f5 w  C2 W8 @
int main()
- g, u% m' }: g8 U+ O{
0 B% Q, l+ @' s4 m/ r        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 T: N& e7 ~! @, h0 i3 C        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 b$ o) ^$ A* c# ^% ]. q+ `- F9 t5 x
        while(1)7 ^5 v8 V7 u7 l& u0 s, E
        {
$ V5 d8 z4 j" U6 i5 v- [                read_MSG_buffer(pshreRAM);
+ E+ U9 G3 v$ N& I8 y        }                8 ]+ Z$ D( e4 j4 X" Y6 y- X
}
7 W0 v1 b  L2 [) @* G! h# ~8 ^1 @$ J( q) A7 j6 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ G8 K  i) D- o{/ m, N2 M' ^3 Z2 X/ z5 i
        RX_MSG_PROTOCOL buf;7 C: U5 a  |* ?; T: h" B
        
+ s; J. F( J  B' ?7 q        buf.a = pshreRAM->a;
) I( A: A: z/ _" h1 T        buf.b = pshreRAM->b;0 _6 E. H" J, O) r
        buf.packet_cout = pshreRAM->packet_cout;
- p. U9 r% a- V3 }% p5 d5 [( L4 M# S8 c        ; j" E9 o( F1 b
        if(buf.packet_cout != count_copy)9 c2 w! b+ _) J
        {
) s$ B3 @( F1 D  X: U8 M9 d                printf("a is %d\n", buf.a);7 q5 f) T" f# U' ^. e
                printf("b is %d\n", buf.b);
' b% _, D6 `5 l6 u                printf("count is %d\n", buf.packet_cout);
- \. S" S6 e0 u; V: K                count_copy = buf.packet_cout;3 s+ x- W  t" @9 a! E# L" a! I. ?
        }8 R# o$ j& V- m7 U4 R4 t
        else
; S7 K' Q! G! _0 u; W4 p        {# ]8 T$ l! c1 C& N! E
                printf("No effective message!");
; T; i$ {3 Y. W2 i        }8 @/ x; h: t" _1 c$ a- W6 O: s
}: b9 {# A8 F% _' y

" x- Q$ `2 F" q4 }" g. w  `+ E  ?- }: R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 n& A& ^! i5 w$ j3 J
使用下面代码,对内存使用了mmap函数后:; Y0 e( {- ?2 C  |% o- i$ o
#include <stdio.h>
% Z" G2 {7 Z! f8 q0 c4 m0 v#include <unistd.h>$ }& a1 D% ]3 u4 \
#include <sys/mman.h>$ l0 ]5 ^) Z. Y* F+ T
#include <sys/types.h>
# u9 g# k. r. A; c  y8 f* W#include <fcntl.h>
$ V* L" _7 u+ A" o8 `. F" @+ m1 ]  M; O  |3 y
#define SHAER_RAM_BASE_ADDR    (0x80000000)
" \5 ~" e/ r& ~. t#define SHAER_RAM_SIZE         (0x20000)   * J/ |% e) d/ w- y% [

/ _; ?3 f! Q6 {' u% H( ytypedef struct
# {! W5 L3 ~& ?( e6 C{7 N( M5 x1 f2 K" e
        unsigned int a;
" U0 N% V1 Z: ?5 \- X5 O        unsigned int b;3 a* a" {$ g; |. F5 }* x0 ]
        unsigned int packet_cout;, J6 C3 ~) x0 H4 v5 c2 A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 A- K$ d1 R6 g1 a
! r5 R1 A1 C2 e* e* x
void read_MSG_buffer(int *baseaddr);) c+ J, c& |  H2 L  @1 o8 ]
unsigned int count_copy = 0;
6 g2 ]9 C& p) m. G; u! B2 h4 E7 R7 C2 R/ G4 K
int main()9 n  W  T- L& R4 l" X
{/ n: Z$ ]$ ]6 B- `1 g& k. l
        int fd;3 q" p( p7 U3 c, W, R3 i1 B- c
        int *mem = NULL;
$ k9 J0 ~. y% H6 a1 u+ P  d  n% ~$ _* A- n; s% e, c8 F
        if((fd = open("/dev/mem", O_RDWR)) <0)
& p& J! z' g* B1 P$ X4 @" \        {
7 c2 J+ }3 ^/ l1 p                perror("open error");# q4 X' n1 B3 B* a& _" P& a! M
                return -1;" L5 ~, Q/ u, k/ y: v  _, D0 E
        }8 {! c# Z. t  c' e/ J  t8 |
        " B) T( \" t" i* j
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 g# w* j( b- A% @+ g  W2 Z. ^

4 T6 n9 \+ s' a/ M        while(1)
6 x7 S- X! `3 |$ W        {
* F+ w/ D& N5 G1 [- e                read_MSG_buffer(mem);  n: F& I5 v8 \1 Y
        }               
# ^7 C& W( t/ ^}
& L! X- T4 }1 d* {/ k! @; }7 T8 M, G! Z" n% z/ g1 u+ M
void read_MSG_buffer(int *baseaddr)
& w( Q2 \% B5 M- K{& E' i1 _4 o3 d: z; u8 x1 n, l
        pRX_MSG_PROTOCOL pshreRAM = NULL;. O4 H2 J7 _( D4 M3 w3 y) `; N5 H
" N/ R  o, w. l- Z8 G+ ~4 Y
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. w& }) j8 c" q" b0 T/ B4 ~, q6 c# k' U
3 u& H' {% E# _; ~% N1 `- w1 o8 g        if(pshreRAM->packet_cout != count_copy)4 Q; s+ \/ Z# |: \! V: t
        {
- e, ]' H( Y9 _& B2 O                printf("a is %d\n", pshreRAM->a);# u' d  b# \  K1 x
                printf("b is %d\n", pshreRAM->b);' m; n# {9 e' f$ H# x* s- V9 T: s
                printf("count is %d\n", pshreRAM->packet_cout);; j5 G: A. k8 r4 ~5 E) j9 x6 O
                count_copy = pshreRAM->packet_cout;. J+ Q/ r! ?2 T- W' l: L3 N; o
        }
# a, Z& R7 n$ H3 M  `7 _9 F        else* k# F2 O) E% M1 T  G2 s9 b
        {. ?- K$ M6 H5 o  ], ~+ [
                printf("No effective message!\n");! I% v$ o) i8 |" S3 G
        }
# e. M3 r; I( J. @}  B, }; |. ]4 |6 @1 Z

) Y4 M+ w, B/ X+ ]2 o! [没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! s7 S5 {' @5 f
/ [/ r- ?4 }  k) m) X0 j- R9 c9 G% Q1 S9 N. p/ I( y' x
7 c& O+ j3 T9 u# ^; p- E

% l5 ]( x- Z! m& ~) o! ^" y$ j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-26 16:59 , Processed in 0.039886 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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