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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, \. e# j" _) H# M3 j
; K9 [7 o1 p, ^  ]: D! T# n, qOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! Y% Z8 G! ?! Z8 X$ E) [( h
#include <unistd.h>) B5 k  R3 W+ \, D( @8 N% |
#include <sys/mman.h>
1 ~3 A% v, v7 z" p% ^* V9 S#include <sys/types.h>
& h( e" M/ Y) e  ^: Y#include <fcntl.h>. `8 m1 h$ j$ T: c+ Y6 O

' r2 t: A: t5 _" q% V#define SHAER_RAM_BASE_ADDR    (0x80000000)   2 y* n8 X7 u& o: p0 H# z
* T' N$ O8 [$ G6 O) j8 w8 f# M
typedef struct
6 B* D* f9 x8 G* Z4 i6 M9 |{
' C! e+ o" `$ Q5 m$ @        unsigned int a;5 F! Q! |0 `: l
        unsigned int b;1 A2 t  H' B9 [+ D+ X
        unsigned int packet_cout;, O1 a% V" k# z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' a3 H7 V! V9 T. G3 [3 q1 T
2 Z' S9 H- A+ Z' ^void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 W9 Q+ d2 g: r% \4 K2 _; _
unsigned int count_copy = 0;1 V& A' g( M! o1 I  {
* ]! E: _# Y( W' h+ o
+ T. ^9 y0 f3 w, n6 Q( }
int main()
) S2 g2 b: m' R7 f{) v0 G& U6 V/ j
        pRX_MSG_PROTOCOL pshreRAM = NULL;
* n( ^# G6 j6 Y" ~  o; w        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; e* a7 S% y: d; b6 l+ U

1 o! ]$ l1 r' \! g' K6 ?        while(1)
/ j9 e' M+ I3 I        {6 c, Z( Z. P( h& V
                read_MSG_buffer(pshreRAM);
2 p' G! S6 H2 t4 }; ^6 @% @        }                0 U7 j- c1 l% W
}/ S9 X6 p& s* x. {

) d2 X4 g, v5 z* h2 ?; I( Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, F8 T' m) k4 ^7 }# u{  v- D# B; m# J9 k6 f- y8 B! i
        RX_MSG_PROTOCOL buf;: b3 B0 l' V) H% }
        
1 K4 h% y2 ~+ g4 g4 u5 X        buf.a = pshreRAM->a;; ]$ ^5 H7 F$ Z
        buf.b = pshreRAM->b;. w8 u( |" g: D. [* i: C5 u
        buf.packet_cout = pshreRAM->packet_cout;* |+ V, q5 P5 e+ Y2 h
        9 T1 `+ p/ T- ]+ L/ j- N0 {
        if(buf.packet_cout != count_copy)
/ W: i! ^' e  b. @        {* t6 e% {, P8 }
                printf("a is %d\n", buf.a);
- t8 @5 {8 \: s+ @                printf("b is %d\n", buf.b);
7 a! a( A8 l9 w3 U; z, F$ a7 Z+ ]                printf("count is %d\n", buf.packet_cout);) Y8 L7 y( s* M5 E6 S6 u5 J( k
                count_copy = buf.packet_cout;6 |/ L+ o1 M9 h" Q1 @4 r
        }; o) V7 P4 V# n7 w' k
        else7 B! w, {! i  `& U( |
        {
  B! v9 g  A. b8 _& K                printf("No effective message!");7 M/ k' _: {. G
        }
9 O  `' s  J; Y}2 I8 o6 G* D. H& ]3 J
! R+ G) U1 V: @0 |) v/ c9 t' t

4 ^5 s- e$ l( E( w* I- n2 A但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。* r: r+ R) ^0 w- H0 [
使用下面代码,对内存使用了mmap函数后:8 ^, q: C1 e: \7 D( B7 F
#include <stdio.h>
9 j. j: a7 T2 d5 e' _0 ?#include <unistd.h>; o$ k# m3 }/ Y, F$ R1 @. {
#include <sys/mman.h>
. q8 p& L1 h) h) X#include <sys/types.h>7 C( y2 A2 Q8 z9 q7 p
#include <fcntl.h>
  p  ^+ r; i( W
# u# A6 N1 X! C1 k6 Z7 R#define SHAER_RAM_BASE_ADDR    (0x80000000)2 v9 J$ T  R9 W# I( d& k% U
#define SHAER_RAM_SIZE         (0x20000)   
; C1 f6 W- [3 N. r0 ?( X3 x* a, |6 C" x! k9 K, |3 B
typedef struct) J4 k( u9 {- g, g! x7 \
{
$ u* W7 w3 F- ~! }1 ^5 X        unsigned int a;
* y! W7 y0 X. p        unsigned int b;
, p1 D' Z+ E& }% d        unsigned int packet_cout;
6 n% w# l! v* v8 j" f" G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 P' N8 Z& G, @) S9 G4 W9 o
0 B' O/ I6 J3 U7 w# ^6 d: Q3 cvoid read_MSG_buffer(int *baseaddr);
3 q, _# G8 M  L+ zunsigned int count_copy = 0;
. t) Y8 i8 x5 ]! q
# s% K: R7 [+ B, B6 b9 H* Xint main()
% X+ o! _* @4 p2 j{
$ x: e2 Q2 y3 S        int fd;6 A, d" G8 S9 Y/ D
        int *mem = NULL;
/ v% t# p' c& |) C0 o! a7 [% w8 [5 }$ Y! A& k9 y
        if((fd = open("/dev/mem", O_RDWR)) <0), g/ u9 {3 H- _) h; C! [  ^
        {: m; V, a9 ^+ `7 N" a* {# C+ `
                perror("open error");* q. ?" x5 `& F; W4 S5 f1 w. A# C5 U
                return -1;  r# |( {/ ~- `% f( p0 y$ p
        }& c' Y+ e; ]0 @7 `8 K/ s% _2 s
        , c. F9 t+ w- A1 o
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- ~) D) o' }7 i" Y) c2 @

3 d& }2 l; ~# Z+ Y' R7 A$ u  k' S        while(1)
* A- o# q6 c. I6 L+ {) K6 D% f        {
+ x! `- ]& y2 X5 Q: A                read_MSG_buffer(mem);& l- B& s' Z! h
        }               
9 ], |! M# \& F. ^8 ^! ?}3 |' ^# i( ~! y' g% w' b4 _' H

3 N* U; ]4 F& w( |: ivoid read_MSG_buffer(int *baseaddr)
) ?) u0 K7 v  O  I{
( E% S& }9 I( }3 U! h( e        pRX_MSG_PROTOCOL pshreRAM = NULL;8 ~/ Y# f  ^2 y0 k: h* t% X. e

6 A, g; @; y$ a) H        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ [8 S- ~% ?! `1 [3 f1 t

1 H! E# s3 U9 U* d2 g! n: s        if(pshreRAM->packet_cout != count_copy)) p' M/ I. ]% u8 U
        {
8 R  T- q' u  R* g. Q8 C  _8 {4 }                printf("a is %d\n", pshreRAM->a);9 M! O1 `; ?% F+ n, ?1 P
                printf("b is %d\n", pshreRAM->b);
* H9 V5 z  T  W( E1 ^  d( B                printf("count is %d\n", pshreRAM->packet_cout);
: c. G( G5 \, F! D" J* Y* ~8 Q                count_copy = pshreRAM->packet_cout;
  Q9 Z, z% y' K9 r        }7 ~3 F% x( Y* H6 G: @. ?3 x3 y
        else+ t7 ?. d$ T# Z
        {: P4 T- a1 A; o5 p) @( t
                printf("No effective message!\n");% e6 ~4 E/ f. p) G1 F
        }- ]7 q$ d8 |4 C7 v
}+ t; m8 h( Y7 b$ k) ^
# e0 N) F/ d9 y, X, L1 K! O% {! v. B1 r: J
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; u: t5 h8 ?6 Q
- Q( X# C& t+ @) b1 n/ L
2 d6 D& y3 n4 O" T! D4 [9 ?+ j5 r" U) e
# c' {5 @( q. B% G( m+ R- a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-28 07:00 , Processed in 0.040439 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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