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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' w. I) O4 O7 K1 [( \
4 Y8 X" I9 S2 S2 ~6 N; n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& a4 u3 h7 S8 Z8 d#include <unistd.h>
  ~/ Z( N- a; ?/ K#include <sys/mman.h>
- H3 N' U- u/ E9 Q- u, M7 }#include <sys/types.h>7 [' B" q5 o5 c' A
#include <fcntl.h>8 [$ |5 z6 t; X/ M0 ]: n
8 m. M: J% P6 `) q
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
: V1 h/ x8 F( w- G% j; D$ F5 y9 ~
typedef struct: T& }0 }+ z+ m+ o9 v# h
{
& y6 U  o+ X8 O2 S" w/ D        unsigned int a;
( M2 H+ b' o6 `1 v; ^+ ^) A4 x/ X        unsigned int b;
# {. f8 |  I2 |2 Y1 b6 S1 u        unsigned int packet_cout;
* F% A+ D4 g' K- I6 l9 Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& e- q8 l  k; @4 ?5 L0 h2 k
# ~. N" |* O. x3 a3 f5 x: @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 E$ i. G3 z5 kunsigned int count_copy = 0;8 u8 _- N& [# |# }( Q7 N
- n6 s: A$ E& K0 I

$ o9 W2 n3 h6 e" k1 U* Y) uint main()
+ k% J9 {9 b5 V6 Y& _+ v5 }/ g{& j6 p9 l8 @# o7 @! y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 c# v& K" X+ P) X' |7 O$ V        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# ]9 C3 m4 u1 k( w% O, N' I5 H, O* L
        while(1)$ ]& j  I, q7 e$ a
        {
" n. ]: n2 n' v) R' T0 L                read_MSG_buffer(pshreRAM);
& t- ?& w& D: H& l# H* }4 c        }                ! `& c. S- Z% S; b
}
& q& M, H# p+ u7 \8 ?+ w/ c# R3 a- W5 v+ e& H& V4 m/ ~* M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! ?+ W8 o7 d, }6 q8 [* b$ N9 p{' `) o8 V# g# g! F( K
        RX_MSG_PROTOCOL buf;
; p, R6 B' u0 w4 v( d/ R        & |$ ~. \. H, L( e' j" z$ o
        buf.a = pshreRAM->a;: q) U- T. F5 i1 |+ ^
        buf.b = pshreRAM->b;  X, C% T! _+ W0 h2 x
        buf.packet_cout = pshreRAM->packet_cout;
0 `0 ]& ?; n+ B/ |8 g8 |( Q  P6 ^        ; _( Y! d3 g6 S" N% ^
        if(buf.packet_cout != count_copy)+ G. Y1 w2 i& U! o7 R9 [
        {
& k- m  m( ?. V) A3 }                printf("a is %d\n", buf.a);
. N5 F( m1 g' I5 Z; \                printf("b is %d\n", buf.b);% H; j  x2 Y( {
                printf("count is %d\n", buf.packet_cout);
3 z: P: y2 E  s! e. K# J  |5 @                count_copy = buf.packet_cout;
6 Q4 N) A6 S! _  `9 B) k; b2 N" p/ C        }* E# x, s$ q( Z( C6 @
        else0 ]1 g6 Y( S7 R: q& o
        {
' D8 d5 J) W2 \8 T                printf("No effective message!");
0 X# j, A* P2 S        }
0 v) x) s" D+ ]. {* N  o: w}& A2 ~( V5 K0 K$ Z1 g
3 S5 U' h; Z" v) _! i* E3 {
0 ~# N; m3 `- O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 Z" ^$ z# n3 c! c" q+ `5 L
使用下面代码,对内存使用了mmap函数后:
) ^- Q( V  Y! X5 k/ u0 Y#include <stdio.h>
$ {+ b4 K# z: j  J#include <unistd.h>3 y9 m! Y* z& ^2 U: X: Z
#include <sys/mman.h>
$ Q0 R# I+ X; L% \#include <sys/types.h>6 r; S' O, h' P1 a
#include <fcntl.h>( R) j3 |9 R1 n* E

! d8 g9 k  ]: q4 v  V% H#define SHAER_RAM_BASE_ADDR    (0x80000000)# v2 r+ [) s; a- v/ u* o6 L
#define SHAER_RAM_SIZE         (0x20000)   
' t: [5 i( S$ i/ C  u( t
# R4 v5 Y. J1 Z- }7 {6 ~4 N5 ktypedef struct  ^0 K! }* U' P" [) L3 c
{; R- D/ n+ V/ [) d1 R8 d* T
        unsigned int a;
* n+ b1 {! H. d5 g        unsigned int b;  n1 T- N7 e# V9 ]! _
        unsigned int packet_cout;) l4 T( a3 `$ M: q% w- q$ V. ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( _  a1 |8 J' k

! b/ ]. L$ l* u7 Lvoid read_MSG_buffer(int *baseaddr);
* v3 U9 `+ ?  ^6 q8 H1 Gunsigned int count_copy = 0;: j6 n5 ]: i- [! p
1 S2 K  ^! F, Z" |
int main()
- A8 W2 m  D8 c, c$ Q8 d2 c9 t1 a9 m{
% L, b/ g. X7 N$ E# K0 {% @        int fd;
! l" @1 u" w7 F        int *mem = NULL;4 u: v$ W. {4 t* y! ]- |0 M

4 a6 d) u% a  \, ^        if((fd = open("/dev/mem", O_RDWR)) <0)
: u3 o7 f& L8 ~' N        {" d7 G, t/ W3 x
                perror("open error");
% m9 x! d: }. s5 ]7 r$ V4 {% f                return -1;
" g+ d9 d  w/ L+ r. X8 ?" k: f2 L        }1 Z2 R) l  G3 w  f! ^4 M; Z
        6 h5 z9 ?" m+ a5 R6 Z7 ^. D
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ S! u& G& u& E' Z- f
1 v, j3 m7 R& f: E
        while(1)
: y; {2 N4 V( W( F7 f        {+ n6 M/ ~4 d# [/ [1 Y! \2 X
                read_MSG_buffer(mem);+ \" z& L; C7 |* ^
        }                ! G9 L: [' m5 P% U
}
* F: e! N1 t& b  Y* s0 @* n
( T* H5 |( [1 Q1 Pvoid read_MSG_buffer(int *baseaddr)
1 a+ z+ Y- f- I/ V% b# Z+ f{4 j8 l- J& x# P8 q) X
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! f0 H; d& @2 M  p! z/ G2 D, u$ l% R5 w
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 A7 _% [5 ]' j& h3 @0 e$ X. G' S4 v. |/ X
        if(pshreRAM->packet_cout != count_copy)
, B7 c" U: L, W        {2 ~1 [% D- @$ ~8 x, ]6 L2 K
                printf("a is %d\n", pshreRAM->a);+ q2 H0 P+ a% ]3 m. W
                printf("b is %d\n", pshreRAM->b);
! Q& W: h) D* _% G: r$ |                printf("count is %d\n", pshreRAM->packet_cout);
( V/ P7 r7 v. s! r5 V8 ]                count_copy = pshreRAM->packet_cout;- i  T. ~( @# q6 Q' b. y
        }- T* g( P0 U$ L3 }# P" \' k
        else
7 T7 C" {" ?4 |' h5 F5 O4 q/ z4 F+ B        {9 r* a! }1 K% I  q" b
                printf("No effective message!\n");
% q9 E7 v1 O( v2 x- q8 _        }7 I  J7 w1 O+ @& g8 H
}
. d4 Z: i- S! I2 E7 @/ w9 i1 u+ k
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 b" d% O, k+ ]9 b/ M% g! {6 K) q
0 W+ I1 ]) [, W( i1 b
) \- I+ R0 T' o, D/ D+ i+ B0 _
) ?% `' \: N9 h, |- D$ `7 t4 W5 k1 ^) G6 c$ j" z) ]' a- r' l: ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-6 01:09 , Processed in 0.040240 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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