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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . R" @( V8 W0 }+ l+ k  e8 l$ X% ?7 g

+ i" n0 C2 A6 `8 q7 r" M' F% A. dOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 Q( ~% y& N1 L3 ~2 P2 b9 T#include <unistd.h>. |  D3 ~3 r# S/ q* h0 R5 F
#include <sys/mman.h>
" `3 i  `& i) ^& e; E" |% ?: A$ g#include <sys/types.h>- q/ j( A. l4 C# d! W+ S
#include <fcntl.h>, l$ x+ P3 m+ j
0 D% V$ P% J6 }
#define SHAER_RAM_BASE_ADDR    (0x80000000)   9 ^/ j# I3 k; S/ ?
0 z/ x) l* f+ |9 ]2 B& q
typedef struct
1 ^5 A: t; _# X! ~* o{
8 ~, v$ B* j3 ?$ I: [9 d        unsigned int a;
% v: V5 F& d% t- K        unsigned int b;
& `% \+ G# Q: p6 D. y% h4 z- v4 v        unsigned int packet_cout;
7 s% G* u* r4 a4 k6 H2 c+ h8 X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* r0 {% v, x7 h& G* ], T4 R1 j) _2 U0 Z1 t" q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* J2 K' `* x+ Munsigned int count_copy = 0;% m/ z2 @" f4 `+ A% p

  t% v: F' d" W+ w6 w6 i, ]. M7 F
' \6 }' H& N# v* y% |; sint main()3 [+ v3 Y. a( s% R1 A$ {5 {
{8 s3 @, n" t$ D) ^5 p+ `
        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 [- g" U, O$ m+ p9 ^8 X) _3 F+ `6 s% V        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 A4 ~' h" h4 N: u) i: Z# u

/ w* L! ?; c+ _( u1 r* c  J+ d1 m6 N  C        while(1)
$ m: n3 Q. h  G5 I" t        {* l9 i$ r% f0 F3 q
                read_MSG_buffer(pshreRAM);
4 z! m- W7 j; m/ g' k& G        }               
5 g' N) d$ g- L/ |: {}' R3 y0 G6 Z8 D7 F8 S; z- y
! [6 ^* C* p; D4 S3 D9 E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) K1 r  W1 y7 ], ]6 {! r. |- w; y! X. C
{0 S8 S# z' J  b7 q( s
        RX_MSG_PROTOCOL buf;
& C* }: u6 [+ t4 q4 s" M" O3 |        4 G2 d1 k6 n  d. z$ q; S2 o. z* i$ X$ g
        buf.a = pshreRAM->a;! i1 k6 R6 L7 Z; a8 J
        buf.b = pshreRAM->b;
* C9 R+ b: |% d! O        buf.packet_cout = pshreRAM->packet_cout;
- @" {- A5 O: O4 e* R; h        
) ~2 `, c+ ?3 Q+ x& `        if(buf.packet_cout != count_copy)
% I  z+ }2 V" U& G: ]( r- P) j        {3 i4 y: a' N2 ]2 ^- B/ ?' O3 @
                printf("a is %d\n", buf.a);! z( I8 Q; ~, Z
                printf("b is %d\n", buf.b);0 W( J  i% t( e0 I* T9 k; k/ w
                printf("count is %d\n", buf.packet_cout);
! }  a8 A; t/ W0 Y5 Z: `                count_copy = buf.packet_cout;; V- |9 J) t" Q/ d. M9 H
        }. G+ k: i2 c: _( ?
        else
8 H* W) T/ U: A. e( w        {
! D  C: C5 i( M                printf("No effective message!");; R- G: i; c: b1 S5 j" m$ m, U
        }2 v  O1 l7 u% F- j3 u, O8 Z% B( H. M
}" a; O/ V$ }) I4 d& A$ o

. G. i# a' r9 L4 r6 V
  d6 z  F. l' m5 K& e但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 {5 c: A! r! E9 K* n) Z
使用下面代码,对内存使用了mmap函数后:
0 `( q: ]( ]$ Q9 {! X#include <stdio.h>
$ e! L; ~: g. k+ M& O2 S% a; Z#include <unistd.h>1 d: Z% l% P: M" @$ R
#include <sys/mman.h>
/ B* |  G! j5 g#include <sys/types.h>/ @: r7 j3 P! S/ ~* _
#include <fcntl.h>
6 v, _% U. C8 S8 I3 w$ Y+ T( D+ l$ s0 K) B) \6 b/ P7 R& L
#define SHAER_RAM_BASE_ADDR    (0x80000000)
6 f) I3 _3 g: \/ p, y4 ^8 F#define SHAER_RAM_SIZE         (0x20000)   
1 l1 j7 G! p: H8 I/ x5 |5 ?+ B) E- O5 G: n
typedef struct2 }1 @2 {* R7 M1 y- n  S! X
{* i0 b% C4 J; p# O- `$ J
        unsigned int a;0 z/ V# s3 U. p
        unsigned int b;
& n/ z# `0 D: [. _: V5 f        unsigned int packet_cout;9 q. k4 G7 ]/ o2 ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 J! N2 p8 a' v$ U

, B' k3 l3 ], Q+ C% Y- Kvoid read_MSG_buffer(int *baseaddr);  x7 R' m6 x* x+ g* L
unsigned int count_copy = 0;# U! N& X5 H! C/ d& n4 V3 @" V
' `4 ?- Y. C/ r# |
int main()- k) e2 A3 j( w
{
% k! t* L/ x; j; d9 ^" P" t        int fd;, F" `3 j6 v4 y" P: @1 d
        int *mem = NULL;
5 L$ k8 N# V: _) I
- n0 A* p/ T0 Y' [7 h/ Y& k% B& K        if((fd = open("/dev/mem", O_RDWR)) <0)0 t% w# N9 i# y; ?% G
        {
* j5 C3 R, ^& ~                perror("open error");% D/ C8 E6 t7 t1 f9 j  Q
                return -1;- e( E9 o$ ~2 e2 B6 `
        }: C2 h" z: I' r5 s" {8 Q; E
        
$ {+ L% g; I) x) N7 z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- _1 a$ l2 D, ?. ]4 F7 z7 E/ O! o4 D+ }4 n& O, X) v
        while(1)5 S2 \! _- t) u( K( M% c) h
        {# i  R% O2 Z. W$ c* j% H0 W( ?
                read_MSG_buffer(mem);8 D  `3 L4 B' C- c1 X. r; h0 D
        }                ! J4 n6 P. }* }# M; m; `0 m  f
}
- G- @! y% h- B' ~3 K# P- n: H  ]4 L  Z$ T
void read_MSG_buffer(int *baseaddr)
% `/ S1 o4 _* ^, L9 ?# c{* g# }! i4 f3 G1 H
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ f+ @; h3 E; B0 C+ H# s1 p
: o4 n# w; l% e1 U9 F0 t* _0 E        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 E2 U8 j1 h) R( b3 t) w4 U7 Z

, @6 Q4 ^: I- N$ S        if(pshreRAM->packet_cout != count_copy)
& _  Y9 |) ]4 e; g( D        {# N' Q- |8 u9 S3 i) L  A2 m8 c
                printf("a is %d\n", pshreRAM->a);4 P1 L/ p; G8 ^8 J
                printf("b is %d\n", pshreRAM->b);. z  s, W; ^* s
                printf("count is %d\n", pshreRAM->packet_cout);: Z, @6 Y3 m7 m, X5 E- j0 f
                count_copy = pshreRAM->packet_cout;  ^) B/ H4 L/ ]0 n& w" A2 K
        }
  P# R9 a0 i8 S) j" E5 A        else. O# H8 U5 z  {) S* c! P
        {' t3 D" P" s% R  U
                printf("No effective message!\n");7 P: \/ E/ S5 H4 v, G
        }
4 Q# u' }2 t0 f& W}
  x4 i- R( B) l' @& t7 `9 o
! N4 A6 @' S: f; u: G" h; m' R3 d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 b* [6 Y! E, u/ e+ I+ Z9 w( T1 w6 k: ^' l8 \& J
0 K, n7 y4 Y, K5 L* k% ~& e) b1 G: p

' L' c% K2 ^0 B2 z, L5 ^6 u8 k7 w& t) m) k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-14 02:07 , Processed in 0.042021 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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