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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * D. }, g7 k9 S( g: S2 g
. Z1 H1 m$ C. P0 |* t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ r0 _3 E/ I& x0 M, |2 Y
#include <unistd.h>  J0 j* G: K' N9 X$ ]' [
#include <sys/mman.h>
& w* |" @7 }$ L9 _#include <sys/types.h>
$ z5 \/ W1 {" e1 \. H3 I$ j( L#include <fcntl.h>5 j8 e/ {4 |4 X7 D. {% S- S

9 g) E: C5 L1 s+ f2 v& M$ j#define SHAER_RAM_BASE_ADDR    (0x80000000)   & |+ c2 c2 t, b+ M  x

6 w  f/ \- B8 E9 F  t8 Rtypedef struct
: r- f' g* U1 e! w{
- p- _; J: E# O" k! M* B        unsigned int a;
9 Q6 s  P/ e: r  j" b1 ^        unsigned int b;6 C+ E3 ^0 E9 b8 l& m) N( U
        unsigned int packet_cout;/ U8 ], y3 ]" N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 I8 N/ w4 g9 l) u% _9 F
- H' {# s: Q1 |  z; O7 uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- s# i: f: n# e$ P0 u4 ]
unsigned int count_copy = 0;1 l* m3 C. L# L4 f- M* H/ H  \+ a

0 D: b: p( t! Z
. b: {: R9 ?. c/ ^int main()
: X" T9 S( b0 K8 p{
' X) T' f- u2 q" ^6 p  |4 P) x        pRX_MSG_PROTOCOL pshreRAM = NULL;
* h% O9 B4 }6 e2 d9 `. `        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; m4 K. {" B) }7 I
7 B. F9 d& b0 R' G; \3 u2 t        while(1)% v' I# S( i5 K- R, k" y4 a
        {+ C" |4 R8 L. J5 z- W) b
                read_MSG_buffer(pshreRAM);
  J: Z4 D2 `2 N        }               
4 J2 _* I7 N( Q}
9 f3 L7 g# o+ U) O, g. j0 c
) O: s1 L3 S5 e' B3 ~/ E1 dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- K% X* Z1 Z1 e+ ~( o{/ w# q; \; L* J/ p3 A
        RX_MSG_PROTOCOL buf;. f7 }: B4 ~) d- e* J
        
( Z  X/ ]% i5 R& q        buf.a = pshreRAM->a;
+ l# A2 @, z7 X        buf.b = pshreRAM->b;$ T1 t" E' m) h
        buf.packet_cout = pshreRAM->packet_cout;
0 Z+ s/ f/ `$ ?1 ]# \$ Q6 [/ o7 T) H* |        
; G. c  [! c- e" @4 v+ P3 f/ c  z) P        if(buf.packet_cout != count_copy)
1 |$ y  s* w' ~# z( g        {+ w8 ]( a# I3 e- w$ y3 X) Q
                printf("a is %d\n", buf.a);
. f  l# ?! @8 C2 N. V" ^) x; ^                printf("b is %d\n", buf.b);
  I- f0 j8 N. X. [5 {( k& Q: j, ~                printf("count is %d\n", buf.packet_cout);
* l( @+ q* q4 X3 k1 W! P6 p) s0 r                count_copy = buf.packet_cout;
" ?2 L* w* X# i$ [# ?" w& }0 ^        }
& q3 {$ I4 `+ F0 }; S8 O        else
- Z8 e! E0 C1 p- A        {
- k$ O6 r2 f6 P0 F                printf("No effective message!");1 j/ z( ~7 @2 V* q( c! E0 J* s9 m
        }3 h. E4 u" I: B" Q) c2 s# t
}
$ n. f8 S+ ^# Z' r: V5 W( E& j
, L* Z: J6 R  ?) D. P8 c: f, y- M: Y5 ^4 g) H4 v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  N  j, p( |5 v* Q4 E使用下面代码,对内存使用了mmap函数后:; I4 E/ H- G, ^* k6 x
#include <stdio.h>: V- f" `2 g3 w" [
#include <unistd.h>
9 X- s0 |" f- h* [9 h#include <sys/mman.h>
$ ~. a: }- h4 d; C& U1 B#include <sys/types.h>3 I8 A. E$ K1 _" u! L! r4 |, o3 k
#include <fcntl.h>
4 I1 v3 j0 x% _4 o$ o' w# ~$ Y! K
#define SHAER_RAM_BASE_ADDR    (0x80000000). F% e0 w" [  b( y
#define SHAER_RAM_SIZE         (0x20000)   # l0 X, D: V$ R8 j: e7 c
- U/ X  B: H. \2 J( T+ \, Z
typedef struct; ~8 h  p9 Q1 ?
{
: {# r7 `( [0 ?: l4 E        unsigned int a;
2 R" i+ ^: ~9 @/ n1 \( ]        unsigned int b;
- o! m& ^' ^1 f! o, Y& U        unsigned int packet_cout;
" C, @# C6 `: A% c( @5 T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 N8 y( D" H4 ]0 M# n
/ V+ ?# G; Q, I; g7 l  T' zvoid read_MSG_buffer(int *baseaddr);
0 K* p) Y2 `0 Tunsigned int count_copy = 0;
; ~3 c; g( B3 p( t" t" _$ ?; B8 }  p4 i2 K
int main()& w# d$ G: W; Y! [! t( q
{
+ W# I% o3 n  o: a, M8 ^- u        int fd;
. A6 N* Y! S% W9 v  H) z$ ~8 z        int *mem = NULL;/ y! l+ a8 S- q- o& L* P! Q
* B% X+ v2 D8 c% r& _8 `, u5 Y
        if((fd = open("/dev/mem", O_RDWR)) <0)6 n9 n- ~: @: S* r) }  ]* e9 e
        {: v+ [9 L4 H& ?) l2 {1 i
                perror("open error");( ]# ]7 _% R& B) A1 M1 J
                return -1;% K' Y" {8 x: j
        }
, D, A) b. P3 D3 j1 W3 A        
" m4 |9 o' n$ M( `- _) |; p7 ]        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, r$ Q  ?2 ]! A4 W! S8 Z  Z9 p$ S

- d- i4 a9 j, L: {        while(1)
7 g3 U4 l0 u) F% @, c1 N; r& \        {
# U1 C  w2 d0 D( m                read_MSG_buffer(mem);
/ [' I0 c0 e7 a$ Z        }               
! y. [3 x3 Y& A8 k2 ~7 s. w}7 H0 ]/ Z( b) h+ H- v( S/ y
: d: D! z- d' S9 c( c1 [( J2 U, x
void read_MSG_buffer(int *baseaddr)$ e9 m6 _; N# [; H
{, s6 k# ?  ~3 k; W* q
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 ^2 D8 _) t2 b: f  d5 h
( o6 _4 P3 y# m# K/ z4 V
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 I8 i( \8 p" k4 O

6 d6 Q' R: S7 v( D        if(pshreRAM->packet_cout != count_copy)
: N( E: y2 {4 O& g: ^& T        {( O9 n& a$ q6 s. K/ n9 A, F0 t
                printf("a is %d\n", pshreRAM->a);
: d$ H" s7 V  }, U* Q                printf("b is %d\n", pshreRAM->b);8 f+ M: N' c" ^
                printf("count is %d\n", pshreRAM->packet_cout);* j  g% N% D* N# v9 N; c9 C+ [
                count_copy = pshreRAM->packet_cout;: Z( p3 Z4 k* N' N
        }; q9 e$ H& f: K% J- Y0 o0 B
        else: D0 ~7 N4 v  `+ ]( r6 a
        {
' Y' s1 f2 }: E( Q4 A+ [% u' S                printf("No effective message!\n");' Q/ K( f/ n* e. `
        }
8 b/ d# r# E0 ^! H9 U! L}6 B" V( v' D7 S7 ~, j+ Y9 P

6 x, K8 N6 Q9 n  e# A$ y1 ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) z4 ^6 c+ {5 X& I( n# W
  O5 a6 d7 L% D2 i1 x
$ V1 B6 M! @! b" T: l
/ s0 r& s- m6 B: \  T( C$ g
! O+ M/ t# D0 Q5 _0 V+ {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-16 16:45 , Processed in 0.040769 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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