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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 F6 T* k1 Z" C6 K# \$ o
. Q; e, b8 U* _
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, O6 B% o$ }. N/ r
#include <unistd.h>, F% i4 _0 U& N* b6 i8 `
#include <sys/mman.h>- ~+ F3 ~& N, J
#include <sys/types.h>
; k6 J5 a' H! [( S: Y5 C7 A#include <fcntl.h>4 k, U6 w6 h/ m& J, F" y4 H

' _3 B* o0 I# j& C#define SHAER_RAM_BASE_ADDR    (0x80000000)   # C' D4 F4 O. D% R+ q) `
. O( `+ j: h3 R- O7 q
typedef struct$ N1 ~3 H4 T- ^+ O/ T
{+ E) C& n% T% D7 c
        unsigned int a;' W( B/ R5 O/ d  D# u3 c
        unsigned int b;
* J( q6 F' M  v% ?1 ?( S        unsigned int packet_cout;
2 t+ C3 `+ ]1 F0 {* G1 o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* O: O! O/ D  a" }. C
  H! L1 J5 n% M$ Z; d! S% D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);$ C$ b) J3 [4 N& c5 h0 o- F
unsigned int count_copy = 0;! m; ], u  s1 |/ F6 X; j5 _
- m& l$ U8 ^( R

2 I6 W' I+ j; c5 l3 kint main()
# R. ~+ j; |# E$ i. X{
% R6 C, E8 _9 U        pRX_MSG_PROTOCOL pshreRAM = NULL;8 T( [6 o- [' P" M! e; ^
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- u: I  f  z1 r, m8 M

+ r- D- U1 J9 Q' s" I        while(1)1 i5 ^6 g* r  T6 ^- _* Z. e' h9 F
        {
5 V! [$ }( M. Z( G1 p                read_MSG_buffer(pshreRAM);
$ o1 s8 j- t2 p* ^' A        }                ' r% m( E! w& R: k
}
( ]/ x: Q/ C- B- v6 u. H% r2 E
0 {" r. \4 H+ t! p* Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 [; E9 L5 F, f& {6 T7 y: _{8 Z- F8 M8 d9 n1 [
        RX_MSG_PROTOCOL buf;3 A8 T  e# X7 g4 l
        . v- P/ l) D9 j! X/ B4 B
        buf.a = pshreRAM->a;
1 z3 S6 ]  G0 M" N3 K; d# M) }6 w        buf.b = pshreRAM->b;) }3 T, c4 k/ u
        buf.packet_cout = pshreRAM->packet_cout;, ]/ i. a- a, f
        
' V7 l$ Y8 ]6 y5 \" y9 P        if(buf.packet_cout != count_copy)1 c4 |) e  r5 m! w
        {
% S; r/ v+ g+ Q7 `( g                printf("a is %d\n", buf.a);
" O9 t' t: |  o( i0 B                printf("b is %d\n", buf.b);
$ N5 S8 H" [3 Q2 S3 K$ @                printf("count is %d\n", buf.packet_cout);
+ G5 N- N& @3 ~" t1 z& G" u. \( {; C                count_copy = buf.packet_cout;& N% Z. l: J6 o# ]) i
        }! E6 g, y. e; z. F1 f- h9 A9 s
        else' T2 E/ q4 ?  I1 I% i6 o
        {
+ G" T  H, ~5 }+ _4 y- t/ |                printf("No effective message!");
+ m, W0 Z/ i7 _- Y- }- }7 ~; C        }
1 n, |* }9 \# Y/ r) s1 Q}8 S' W' I/ P2 |8 Y
+ ?  K! o+ W% b( T% h
6 ]# |! V# t; d# L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 r% n+ a* k5 p9 ?4 K
使用下面代码,对内存使用了mmap函数后:) z1 f  s, V: H% b' U
#include <stdio.h>
+ R$ `# N  F6 ]/ I3 {3 k6 N#include <unistd.h>
: Z/ K# T! g( K& C8 y+ `! v#include <sys/mman.h>
6 g7 D" k7 X! a! U#include <sys/types.h>& i9 B+ ?2 j- D
#include <fcntl.h>, b7 S- l5 G  j$ y+ o
9 H8 p* W$ m2 b4 r/ M' a' w# {
#define SHAER_RAM_BASE_ADDR    (0x80000000)
, `& `& U0 b, T& Q# _#define SHAER_RAM_SIZE         (0x20000)   3 F" j4 [/ A+ g' k

) a) M8 k( s  a; c2 @4 ftypedef struct
8 @; {6 R# _8 g- H8 S7 v{
: o% l) j$ }2 j( j        unsigned int a;. k& e) W9 J1 r0 O4 W* ?
        unsigned int b;  V) A9 w( J. z8 P% K6 i
        unsigned int packet_cout;9 q  W+ T. w" h0 c/ l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 k  c" }3 c& g5 r9 C- s  F
. J! d0 l- x1 G2 \3 Q* uvoid read_MSG_buffer(int *baseaddr);
: O+ Q, Y; R  x/ ]unsigned int count_copy = 0;) P- \4 M' w: h

  q2 n2 W5 c7 W! z% f& qint main()8 L5 q+ R6 f+ j* Z" b" Q# G
{
' O1 p' O* ]" y$ y        int fd;, x9 j. _! p$ f3 ~
        int *mem = NULL;
5 c0 R8 R/ p9 d! L! p6 F/ J( V) p' |3 D1 ~& D0 N- ^0 |6 v) ?
        if((fd = open("/dev/mem", O_RDWR)) <0)
; ~3 G; P' K1 c! J& l        {
+ e( @( \6 x- {0 u& P; M                perror("open error");. }) g( G  E0 }# p0 M
                return -1;/ ~; h! e7 C8 T$ h& S
        }
5 z3 ?) R! \' g+ Y5 n$ X) R- ~        # S1 q) A6 V; L+ Z, M
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ j  N# H* ]+ G+ Y' l
: ^3 e/ k1 P% \+ x        while(1)
. Y/ a2 W* @  Z' Q( E        {6 A2 G, M2 E9 Y8 F' b. M2 m+ J
                read_MSG_buffer(mem);3 Z( U1 g  u2 I5 I7 U8 y2 K
        }                . g* D" u$ S, g4 K; @
}! w- [+ M' {0 ?8 J* k

& ~" u2 V1 W0 _5 V* c  f. ovoid read_MSG_buffer(int *baseaddr)0 x7 Y* V/ U. l) j# S& n7 l
{
* \; P" S! x* ]5 S5 _! ?$ R) y        pRX_MSG_PROTOCOL pshreRAM = NULL;
( J" p* L9 v- W1 F' a* A$ k" A( H
: u) e) u3 T5 B& ?        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! }! ]% a  {3 ^3 k6 |
% I* _. ]" r! @5 E
        if(pshreRAM->packet_cout != count_copy)
3 N4 j/ r% }; Y4 E7 C% o        {
" n: z; O4 A, ~' l! G$ G& H                printf("a is %d\n", pshreRAM->a);
9 }4 U( p: j( T+ E" D2 E                printf("b is %d\n", pshreRAM->b);
/ C- g: {( q$ E/ A6 }                printf("count is %d\n", pshreRAM->packet_cout);7 c4 `% _: _6 Z0 X# ?! r7 e9 u
                count_copy = pshreRAM->packet_cout;
9 ?. D6 y; |% r4 L2 m" I        }
: F% l( h/ d" X3 a+ E- L0 }        else3 [8 k7 e, Y6 M' f/ Q
        {
  d/ r2 F3 Z2 w" K                printf("No effective message!\n");
; a2 f4 ^( K6 n8 C2 Q5 m        }
& @  E; K; D/ ~! p$ G}$ h3 U" a; u% y: D
+ z6 N% O' p7 l6 O( V
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???# b( F+ v1 f% r" ]) h4 i
1 U9 C7 }) d) {! U' j% J+ y

% g: E) E) ?, z$ a5 G0 D6 X" {. B% h$ @9 N3 R0 Q

3 S/ f  L( t. G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-14 06:41 , Processed in 0.041219 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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